为什么
map (^2) [1..10]
工作还有
map (2^) [1..10]
工作?
我希望它只适用于其中一个,而不适用于两者。
我认为 map 会迭代 [1..10]
的所有元素,然后执行
[1^2, 2^2, 3^2, ...]
对于 map (^2) [1..10]
。然后我期望当给定 map (2^) [1..10]
时,它会产生语法错误或其他错误,因为它需要数字位于 之后>^
,不是之前。
最佳答案
Haskell 语法对这样的构造有特殊支持,称为“运算符部分”。如果您有任何中缀运算符,例如 #$%
,则支持以下表示法:
(#$%) = \x y -> x #$% y
(#$% y) = \x -> x #$% y
(x #$%) = \y -> x #$% y
所以你期望一些数学一致性来打破这个,如果 Haskell 是像 Forth 这样的微型语言,我会倾向于同意你的直觉。它起作用的原因基本上是“因为他们编写它就是为了那样工作”。
(添加它也是为了减少歧义 - f + x
是指应用于两个参数的 f
,还是指 +
应用于两个参数?既然它实际上意味着后者,那么我们如何表示前者?答案:使用 ()
引入运算符部分。)
关于haskell - 为什么map (^2) xs 和map (2^) xs 在Haskell 中都能按预期工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4703576/