对 OCaml 的行为感到好奇

Curious about behaving of 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>

为什么会这样,为什么这两个乍看起来相同的函数的定义不同?

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

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

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