Haskell加法运算

Haskell加法运算,haskell,syntax,functional-programming,add,Haskell,Syntax,Functional Programming,Add,在一个需要添加两个数字的挑战中,用户得到了一个超级简约的答案 add = (+) 它是如何工作的,并且有自己的名字吗?这里有一个明确的定义: add a b = a + b Haskell中的一个特性是,我们可以将a+b重写为(+)a b,这是因为操作符是Haskell中的函数。所以我们可以重写: add a b = (+) a b 但是我们没有对这个函数的参数做任何额外的操作,所以我们可以通过删除显式参数*来减少这个函数。请注意,这需要了解Haskell中函数应用程序的工作原理: add

在一个需要添加两个数字的挑战中,用户得到了一个超级简约的答案

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中称为无点样式



*如前所述,这被称为。

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

three = 3
3
只是一个Haskell值,我可以在任何时候给它起一个新的名字,引用它,得到一些(至少在运行时)与
3
本身无法区分的东西

事实上,
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(默认,2017年9月14日,22:51:06)
有关详细信息,请键入“版权”、“信用”或“许可证”
IPython 6.1.0——一种增强的交互式Python。键入“?”以获取帮助。
在[1]中:导入数学
在[2]中:root=math.sqrt
在[3]中:根(4)
Out[3]:2.0
关于
add
更有趣的是
+
是一个中缀运算符(因为它由非字母字符组成)。但是Haskell允许使用这样的中缀运算符,就像使用任何其他变量一样自由,包括您可以定义自己的变量。唯一有点不同的是解析规则<代码>+不能是一个独立的语法单元,但必须在每一侧用要添加的参数或括号括起来。后者,
(+)
,从编译器的角度来看,实际上是加号运算符:二进制函数,尚未应用于任何参数。所以,当你想给这个操作符起一个新名字时,你需要写

add = (+)
顺便说一句,您也可以给它一个新的操作员名称,如

(⊕) = (+)

…然后可以像
3那样使用⊕ 4
,就像你可以使用标准的
+
操作符一样。

它被称为“无点”,这是哈斯克尔所建立的lambda演算的固有属性。作者可以编写
add x y=x+y
,这是另一种说法
add=\x y->(+)x y
(即,
add
是一个带有参数
x
y
的函数,它将函数
(+)
应用于
x
y
)。您可以通过此删除这两个参数。这取决于您所说的“it”是什么意思。
+
周围的括号?
=/code>符号?没有参数的名称?