这是我的代码
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 - > '一个' >
答案 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#要求您明确所有转换以确保正确性(这也适用于数字类型之间的转换)。