部分应用程序如何在这里工作?

时间:2010-11-04 00:24:24

标签: haskell syntax

> map (++ "!") ["a", "b", "c"]
["a!","b!","c!"]
> (++) "!" "a"
"!a"

这两行对我来说没有意义。在++中使用map时,似乎第一个参数会附加到第二个参数,但在第二个列表中则是另一个参数。 Haskell如何推理map函数中的行为?

3 个答案:

答案 0 :(得分:9)

(++ "!")是一种称为operator section的特殊语法。它部分应用了中缀运算符的 second 参数,而(++) "!"与普通的部分应用程序一样,并且正在应用第一个参数。

对于使用带有反引号的中缀式常规函数,你也可以做同样的事情:(`map` [1..3])相当于(\f -> map f [1..3])

这看起来很奇怪,因为它是,这是一个特殊情况的额外功能,只是因为它非常有用。

答案 1 :(得分:2)

部分申请(++ "!")(\x -> x ++ "!")相同。换句话说,表达式(++ "!")足够聪明,知道"!"(++)的第二个参数。它知道这一点,因为它知道++是一个中缀运算符。在第二个表达式中,(++) "!" "a""!" ++ "a"相同,并且符合您的期望。

答案 2 :(得分:2)

map (++ "!) ["a", "b", "c"]

相当于

["a" ++ "!", "b" ++ "!", "c" ++ "!"]

(++) "!" "a"

相当于

"!" ++ "a"

希望这有帮助。