Haskell 加法运算
Haskell Add-Operation
在 Codefights challenge where you have to add two numbers the user kaiochao 中有一个超级简约的答案
add = (+)
它是如何工作的,这个功能有自己的名字吗?
这里有一个明确的定义:
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 mentioned, this is called eta-reduction.
这个“功能”就是变量赋值。它的工作方式与写作相同
three = 3
3
只是一个 Haskell 值,我可以随时给它一个新名称,引用它,并得到一些(至少在运行时)与 [= 无法区分的东西16=]本身。
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 允许像使用任何其他变量一样自由地使用此类中缀运算符,包括您可以定义自己的变量。唯一有点不同的是解析规则。 +
不能是一个独立的句法单元,但必须在每一侧都用要添加的参数或括号括起来。后者 (+)
实际上是 加号运算符 从编译器的角度来看:二元函数 未 尚未应用任何论点。所以,当你想给这个运算符一个新的名字时,你需要写
add = (+)
顺便说一句,你也可以给它一个新的运算符名称,比如
(⊕) = (+)
...然后可以像 3 ⊕ 4
一样使用,就像使用标准 +
运算符一样。
在 Codefights challenge where you have to add two numbers the user kaiochao 中有一个超级简约的答案
add = (+)
它是如何工作的,这个功能有自己的名字吗?
这里有一个明确的定义:
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 mentioned, this is called eta-reduction.
这个“功能”就是变量赋值。它的工作方式与写作相同
three = 3
3
只是一个 Haskell 值,我可以随时给它一个新名称,引用它,并得到一些(至少在运行时)与 [= 无法区分的东西16=]本身。
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 允许像使用任何其他变量一样自由地使用此类中缀运算符,包括您可以定义自己的变量。唯一有点不同的是解析规则。 +
不能是一个独立的句法单元,但必须在每一侧都用要添加的参数或括号括起来。后者 (+)
实际上是 加号运算符 从编译器的角度来看:二元函数 未 尚未应用任何论点。所以,当你想给这个运算符一个新的名字时,你需要写
add = (+)
顺便说一句,你也可以给它一个新的运算符名称,比如
(⊕) = (+)
...然后可以像 3 ⊕ 4
一样使用,就像使用标准 +
运算符一样。