我只知道在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"
那么如何纠正我的情况呢?感谢。
答案 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"]