如何获得`int - > (int - > int)`?

时间:2014-07-07 07:35:36

标签: ocaml

这两种类型:int -> int -> intint -> (int -> int)是否相同?

如果我写let f x = fun y -> x + y + 1,utop会返回int -> int -> int。但我想要的是一个函数,它接受一个int作为参数,然后返回一个函数,该函数也接受一个int并返回int,即int -> (int -> int)

有办法吗?

同样对于(’a * ’b -> ’c) -> (’a -> ’b -> ’c),我写了let f g = fun a b -> g (a,b),但它返回(’a * ’b -> ’c) -> ’a -> ’b -> ’c,括号被删除。但为什么呢?

如果结果返回了新函数,那么它是否会被咖喱?

3 个答案:

答案 0 :(得分:2)

通常,在lambda演算中,所有函数都有1个参数。带有两个参数(不是元组)的函数是带有1个参数并返回另一个函数的函数。如果从这个角度来看问题,你就会明白->是正确关联的。

答案 1 :(得分:2)

是的,它们是一样的。箭头是一个右关联的中缀构造函数,这就是为什么括号在右边是多余的。

了解

可能会有所帮助
let f x y z = e

只是

的语法糖
let f = fun x -> fun y -> fun z -> e

其他一切都在那里形成。

答案 2 :(得分:0)

是的,它们是一样的。

您可以尝试一下,只需输入

即可
let f x y = x + y + 1;;
val f : int -> int -> int = <fun>
# let g = f 1;;
val g : int -> int = <fun>
# let _ = List.map g [1;2;3];; (* would do the same with (f 1) instead of g *)
- : int list = [3; 4; 5]

整个想法是默认情况下功能是curryfied。由于a -> ( b -> c )a -> b -> c是等效的,因此它们会显示为最轻的类型。