这个错误是什么意思,以及如何修复它?

时间:2017-09-01 18:33:27

标签: f#

这是我的代码

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

错误是:

  

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

     

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

     

stdin(2,26):错误FS0001:类型不匹配。期待一个       ' a但给出了一个       ' a - > int - > ' a在统一' a' a时,结果类型将是无限的。和' a - > int - > '一个'   >

1 个答案:

答案 0 :(得分:5)

您已将Interest定义为带有三个参数的函数,但您传递的内容并不匹配。它的编写方式,你只需要在一个参数中传递一个针对Interest的递归调用 - 带括号的表达式a ((1.0=a)*b) (c-1)。在此,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)这样的东西?

与支持" bools"之间隐式转换的类C语言不同。和整数,F#要求您明确所有转换以确保正确性(这也适用于数字类型之间的转换)。