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

标签 haskell functional-programming

为什么

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/

相关文章:

javascript - 当您真正想要产生副作用时, "functional programming"背后的哲学是什么?

Python 等同于 Scheme Apply

haskell - 为什么我必须按字段强制此数据类型,而不是一次全部强制?

haskell - 在 Haskell 中删除文件的最后一行

haskell - jsonToRepJson 坏了吗?

functional-programming - Scala 组合器解析器到映射问题

haskell - `liftM` 的名字是不是受到了数学中的电梯的启发?

F#排序问题

haskell - 如果模式与 `Maybe a` 匹配结果

haskell - 使用 Stack 分析构建