为什么加号(+)的类型被认为是int -> int -> int
而不是(int * int) -> int
?对我来说,第二个是有道理的,因为它“接受”一个2元组(加数)并返回一个int
(它们的总和)。
谢谢!
答案 0 :(得分:11)
您可以制作(+)
类型为(int * int) -> int
的语言。实际上,SML就是这样运作的。它只会影响中缀运算符的含义。然而,OCaml约定强烈支持使用curried函数(类型a -> b -> c
)而不是未使用的函数。一个很好的结果是你可以部分应用它们。例如((+)7)是类型int -> int
的有意义的表达式。我经常发现这种符号很有用。
答案 1 :(得分:2)
这可能看起来有点无用,但这是因为该函数有两个参数。
当一个函数接受一个元组时,它实际上是一个参数。
因为(+)
是一个内联函数,所以只使用一个参数就没用了,因为它看起来像+ (1,2)
而不是1 + 2
。