Haskell Add-Operation

时间:2017-10-23 13:05:00

标签: haskell syntax functional-programming add

Codefights挑战中你必须添加两个数字,用户kaiochao有一个超级简约的答案

add = (+)

它是如何工作的,并且这个功能有自己的名字?

2 个答案:

答案 0 :(得分:6)

这里有一个明确的定义:

add a b = a + b

Haskell中有一个功能,即我们可以将a + b重写为(+) a b,这是因为运算符是Haskell中的函数。所以我们可以改写:

add a b = (+) a b

但是我们对这个函数的参数没有做任何额外的事情,所以我们可以通过删除显式参数*来减少这个函数。请注意,这需要了解Haskell中的函数应用程序的工作原理:

add = (+)

这是因为函数是Haskell中的数据。这实际上是说plus和加法的功能是相同的。

在实践中,我们可以通过代替:

来看到这一点
  add 1 2
= (+) 1 2 -- Since add = (+), this can be read literally.
= 1 + 2   -- This is how operators work in Haskell.
= 3       -- Calculation.

这在Haskell中被称为无点样式。

*提到@Benjamin Hodgson,这称为eta-reduction

答案 1 :(得分:5)

这个“功能”只是变量赋值。它的工作方式与编写

相同
three = 3

3只是一个Haskell值,我可以在任何时候给出一个新名称,引用它,并得到一些(至少在运行时)与3本身无法区分的东西。 / p>

add有一个更复杂的类型,即函数类型这一事实,对这种变量赋值的工作方式没有任何改变。我当然可以定义

root = sqrt

...然后评估root 4以获得2.0作为结果。或者,对于任何自定义函数,

foo :: Int -> String
foo n = concat $ replicate n (show n)

bar = foo

GHCi> bar 3
"333"
GHCi> bar 7
"7777777"

所有这一切与我写作的方式没有什么不同

Python 3.5.2 (default, Sep 14 2017, 22:51:06) 
Type 'copyright', 'credits' or 'license' for more information
IPython 6.1.0 -- An enhanced Interactive Python. Type '?' for help.

In [1]: import math

In [2]: root = math.sqrt

In [3]: root(4)
Out[3]: 2.0

add更有趣的是+中缀运算符(因为它由非字母字符组成)。但是Haskell允许使用这样的中缀运算符,就像任何其他变量一样,包括你可以定义自己的变量。唯一不同的是解析规则。 +不能是一个独立的语法单元,但必须在每一侧都包含您要添加的参数或括号。后者(+)实际上是编译器的观点 plus运算符:二进制函数 not 尚未应用于任何参数。因此,当您想为此运算符指定新名称时,需要编写

add = (+)

顺便提一下,你也可以给它一个新的运营商名称,比如

(⊕) = (+)

...然后可以像3 ⊕ 4一样使用,就像使用标准+运算符一样。