对OCaml的行为感到好奇

时间:2016-02-07 19:10:49

标签: functional-programming ocaml

我有一个问题,为什么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>

为什么它表现得那样,为什么这两个定义看起来同样的功能不同呢?

1 个答案:

答案 0 :(得分:5)

在您的第二个定义中,您有xy两个不同的外观(绑定)。这就是为什么结果中有四个参数的原因。这就是你想要的:

let abs_diff = fun x -> fun y -> abs (x - y)

(FWIW在实际操作中我有时会犯这个错误,尤其是在使用function关键字时。)