为什么
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错误或其他东西,因为它需要数字在^
之后,而不是之前。
答案 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)