2017-09-01 120 views
0

这是我的代码这个错误是什么意思,以及如何解决它?

let rec Interest a b c = 
    if (c=0) then b else Interest(a ((1.0+a)*b) (c-1));; 

错误是:

如果(C = 0),则b,否则利息(一个((1.0 +α)* B)(C-1)); ;

------------------------- ^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^

标准输入(2,26):错误FS0001:类型不匹配。期待 '一但给予 ' 一 - > INT - > 'a '和'A' 一个统一时所得到的类型将是无限' - > INT - > '一个' >

+0

[F#类型不匹配时调用函数]可能重复(https://stackoverflow.com/questions/32236509/f-type-mismatch-while-calling-function) – scrwtp

回答

5

您已将Interest定义为一个接受三个参数的函数,但您传递的内容与该参数不匹配。它的写法是,你只传递给Interest的递归调用的单个参数 - 括号中的表达式​​。在这里,a被推断为两个参数,((1.0=a)*b)(c-1)功能。

长话短说,这抛弃了类型推理算法,直到它放弃说它不能给Interest给出什么类型的挂起。

你想要的是这样的:

let rec Interest a b c = 
    if (c=0) then b else Interest a ((1.0=a)*b) (c-1) 

你也有一个问题,(1.0=a)。这将评估为一个布尔值,您稍后需要将其与b相乘。不知道意图是什么,但你可能正在寻找像(if 1.0 = a then 1 else 0)

与支持“布尔变量”和整数之间的隐式转换C的语言,F#要求,使所有转换明确,以确保正确性(这也适用于数值类型之间的转换以及)。

+1

它不是一个元组。没有逗号。它将“a”视为两个参数的函数。 –

+0

谢谢,你当然是对的。 – scrwtp

+0

谢谢你,所以把括号周围的3个参数引发的问题,但有没有办法把周围参数的括号...以冗余明确3个ARGS中传递?附:编辑(1.0 = a)..这是一个错字 – greg

相关问题