我试图解密下面的calc函数的返回,但我非常困惑。
我有f函数,需要3个int并返回一个int。
我认为计算函数应该返回val calc : int -> int = <fun>
,因为f必须采用3个整数,我给它x和y所以现在需要多一个返回另一个int,即最终结果。为什么这个逻辑不正确?
我无法理解实际输出,特别是当我将f中的参数强制为整数时的多态值。
# let f (x : int) (y : int) (z : int) = x + y + z;;
val f : int -> int -> int -> int = <fun>
# let calc x y f = f x y;;
val calc : 'a -> 'b -> ('a -> 'b -> 'c) -> 'c = <fun>
答案 0 :(得分:1)
在表达式let calc x y f = f x y;;
中,f
是一个局部绑定变量(calc
绑定x
,y
然后f
)比你之前定义的功能。
如果你写了let calc x y = f x y;;
,那么你就会得到预期的结果。
答案 1 :(得分:1)
函数calc
不包含函数f
的引用。有一个名为f
的参数可以命名为g
,而不会更改任何内容:let calc x y g = g x y
。如果你想使用上面定义的函数f
而不是任何正确类型的函数,你不能将f
作为参数传递,你应该像这样重写calc
:< / p>
let f x y z = x + y + z
let calc x y = f x y
然后calc
将使用int -> int -> (int -> int)
类型,更常见的是int -> int -> int -> int
。