为什么map(^ 2)xs和map(2 ^)xs在Haskell中都按预期工作?

时间:2011-01-16 03:07:50

标签: haskell functional-programming

为什么

map (^2) [1..10]

工作,也

map (2^) [1..10]

工作?

我希望它只与其中一个合作,而不是两者兼而有之。

我认为地图将遍历[1..10]的所有元素,然后执行

[1^2, 2^2, 3^2, ...]

代表map (^2) [1..10]。然后我希望当给出map (2^) [1..10]时,它会产生一个sintax错误或其他东西,因为它需要数字在^之后,而不是之前。

3 个答案:

答案 0 :(得分:16)

Haskell语法对这样的构造有特殊支持,称为“操作符部分”。如果您有任何中缀运算符,例如说#$%,则支持以下表示法:

(#$%)   = \x y -> x #$% y
(#$% y) = \x   -> x #$% y
(x #$%) = \y   -> x #$% y

所以你期待一些数学上的一致性来打破这个,如果Haskell是一个像Forth这样的微不足道的语言,我会倾向于同意你的直觉。它起作用的原因基本上是“因为他们把它写成了那样的工作”。

(它也被添加以减少歧义 - f + x意味着f应用于两个参数,还是意味着+应用于两个参数?因为它实际意味着后者,我们如何代表前者?答案:使用()引入运算符部分。)

答案 1 :(得分:3)

Haskell知道^是一个中缀运算符,所以它将(2^)解释为f(x) = 2^x,将(^2)解释为f(x) = x^2

答案 2 :(得分:0)

(2 ^)创建一个新函数,它接受一个参数并调用(2 ^参数)。这是一种curryfication。

以下是与其背后理论的联系:Partial Application(Haskell.org)