我是OCaml上的新手,我试图制作一个尾递归函数来计算浮点数的阶乘。这就是我所做的:
let factorial num =
let rec aux i f =
if i=num then f
else aux (i+.1.) (float f*.(i+.1.))
in aux 0. 1.;;
它给了我这个错误:这个表达式有float类型,但是表达式的类型为int。
我不知道如何解决这个问题,因为我无法找到错误的位置。
答案 0 :(得分:3)
# float;;
- : int -> float = <fun>
是一个接受int并返回浮点数的函数。
float f
因此,您的表达式f
强制aux
成为一个int,这迫使aux
将一个int作为最终参数,然后由于{{{1}的参数而被破坏来自(float f*.(i+.1.))
的1}}是一个浮点数。
看起来你希望所有东西都是浮动的,所以你只需要将调用放到float
。
# let factorial num =
let rec aux i f =
if i=num then f
else aux (i+.1.) (f*.(i+.1.))
in aux 0. 1.;;
val factorial : float -> float = <fun>
# factorial 4.0;;
- : float = 24.