这两种类型:int -> int -> int
和int -> (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
,括号被删除。但为什么呢?
如果结果返回了新函数,那么它是否会被咖喱?
答案 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
是等效的,因此它们会显示为最轻的类型。