> map (++ "!") ["a", "b", "c"]
["a!","b!","c!"]
> (++) "!" "a"
"!a"
这两行对我来说没有意义。在++
中使用map
时,似乎第一个参数会附加到第二个参数,但在第二个列表中则是另一个参数。 Haskell如何推理map
函数中的行为?
答案 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"
希望这有帮助。