我有一个问题,为什么OCaml表现得有点不同寻常。通过定义函数
let abs_diff x y = abs(x - y);;
我们现在通过定义为
获得val abs_diff : int -> int -> int = <fun>
let abs_diff x y =
fun x -> (fun y -> abs(x - y));;
val abs_diff : 'a -> 'b -> int -> int -> int = <fun>
现在使用另一个名为
的函数 let dist_from3 = abs_diff 3;;
第一个定义它完美地工作但是第二个定义它不能按预期工作。我们知道它是
val dist_from3 : '_a -> int -> int -> int = <fun>
为什么它表现得那样,为什么这两个定义看起来同样的功能不同呢?
答案 0 :(得分:5)
在您的第二个定义中,您有x
和y
两个不同的外观(绑定)。这就是为什么结果中有四个参数的原因。这就是你想要的:
let abs_diff = fun x -> fun y -> abs (x - y)
(FWIW在实际操作中我有时会犯这个错误,尤其是在使用function
关键字时。)