2012-07-03 42 views
5

为什么加号(+)被认为是int -> int -> int而不是(int * int) -> int?对我来说,第二个是有道理的,因为它“接受”2元组(加数)并返回一个单独的int(它们的总和)。OCaml类型的加号运算符

谢谢!

回答

11

您可以制作一种语言,其中(+)的类型为(int * int) -> int。事实上,SML正是这样工作的。它只影响中缀操作符的含义。然而,OCaml惯例强烈支持使用curried函数(类型为a -> b -> c),而不是没有问题的函数。一个不错的结果是你可以部分应用它们。例如((+)7)是int -> int类型的有意义的表达。我觉得这个表示法经常使用。

+1

你能解释一下((+)7)是int-> int类型吗?这让我感到困惑。它如何从int到int? –

+1

简短的回答是,它是一个函数,它将7添加到你给它的任何东西。这相当于'有趣的x - > x + 7'。对于更长的答案,如果你愿意,我可以在上面编辑我的答案。 –

+0

@JeffreyScofield:从技术上讲,它相当于'fun x - > 7 + x',但这里是一样的东西 – newacct

2

这可能看起来有点无益,但这是因为该函数有两个参数。

当一个函数接受一个元组时,它实际上只接受一个参数。

因为(+)是一个内联函数,所以采用单个参数将不会有用,因为它看起来像+ (1,2)而不是1 + 2