这是我的代码
let rec Interest a b c =
if (c=0) then b else Interest(a ((1.0+a)*b) (c-1));;
Run Code Online (Sandbox Code Playgroud)
错误是:
如果(c = 0)则b其他兴趣(a((1.0 + a)*b)(c-1));;
------------------------- ^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^
stdin(2,26):错误FS0001:类型不匹配.期待'a但是给'a - > int - >'a当统一''a'和'' - > int - >'a'时,结果类型将是无限的
你已经定义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)
Run Code Online (Sandbox Code Playgroud)
你也有问题(1.0=a).这将计算为您稍后要与之相乘的布尔值b.不确定意图是什么,但你可能正在寻找类似的东西(if 1.0 = a then 1 else 0)?
与支持"bools"和整数之间的隐式转换的类C语言不同,F#要求您明确所有转换以确保正确性(这也适用于在数字类型之间进行转换).