map 2函数组合失败:语法错误?

时间:2016-03-02 04:59:15

标签: function haskell combinations

我只知道在Haskell"。"可以用来组合函数,所以我尝试了:

Prelude> map (++" world")["hello","abc"]
["hello world","abc world"]
Prelude> map (++" world". ++"xyz")["hello","abc"]

<interactive>:3:18: parse error on input `++'

为什么我不能这样做?我试过命名函数,没关系:

Prelude> map (head.tail)["hello","abc"]
"eb"

那么如何纠正我的情况呢?感谢。

3 个答案:

答案 0 :(得分:3)

当您说(++ "world")时,您所做的事情的名称是您正在使用所谓的&#34;右侧部分&#34; &#34;部分应用的中缀运算符&#34;:

https://wiki.haskell.org/Section_of_an_infix_operator

对于(++ "world"),这意味着左侧将是生成函数的参数,它将使用&#34; world&#34;预先填充右侧。

所以它不仅仅是使用括号来表示优先级......它是一种特殊的语法。省略第二个++上的括号时,表示您没有在那里调用语法。它试图将其解释为正常中缀。

如果你想组合这样内联的这种类型的两个函数,你可以将它们分别放在括号中:

Prelude> map ((++" world") . (++"xyz"))["hello","abc"]
["helloxyz world","abcxyz world"]

如果您仅使用非部分应用语法将++运算符转换为前缀,请注意对结果的影响:

Prelude> map ((++) " world" . (++) "xyz")["hello","abc"]
[" worldxyzhello"," worldxyzabc"]

你不必将它们分组,但现在你提供了第一个参数。您的列表数据会在输出结束时结束。这与使用带有左侧部分的中缀部分应用程序语法相同:

Prelude> map ((" world" ++) . ("xyz" ++))["hello","abc"]
[" worldxyzhello"," worldxyzabc"]

仅供参考:如果您希望合成的顺序相反(世界第一,然后是xyz),您可以使用Control.Arrow中的>>>

Prelude> import Control.Arrow
Prelude Control.Arrow> map ((++" world") >>> (++"xyz")["hello","abc"]
["hello worldxyz","abc worldxyz"]

答案 1 :(得分:1)

++是一个中缀运算符,您可以使用它的规则与普通函数的规则不同。

你可以把它夹在两个值之间,比如这个

x ++ y

或使用括号将其转换为正常函数

(++) x y --same as above

有两种方法可以将值部分应用于中缀运算符

(x ++) --same as \y -> x ++ y
(++ y) --same as \x -> x ++ y

这两个都需要外括号,否则Haskell会尝试将表达式解析为正常的中缀案例

++ x . ++ y -- will confuse the parser

(++ x) . (++ y)

将起作用

答案 2 :(得分:0)

中缀运算符,如括号。

Prelude> map ((++ " world") . (++ "xyz")) ["hello", "abc"]