2016-02-07 33 views
1

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

0123的另一个功能

与第一个定义它完美的工作,但第二个它没有按预期工作。我们得到,这是

val dist_from3 : '_a -> int -> int -> int = <fun>

为什么它表现得像是,为什么在第一的这两个定义看起来相同的功能有什么不同?

回答

5

在您的第二个定义中,您有两个不同的外观(绑定)xy。这就是为什么结果中有四个参数。这是你想要什么:(FWIW在实际操作中我有时会犯这种错误,尤其是使用function关键字时)

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

+0

现在我看到我的错也,谢谢:d – measuretheory