不懂连接运算符(++)

时间:2016-12-01 10:32:13

标签: haskell

我对列表连接有疑问。函数加上加号(++)的工作与括号不同

(++ "abc") ("xyz") >>> it's xyzabc
(++) "abc" "xyz"   >>> it's abcxyz

我认为这是因为:

(++ "abc") ("xyz") >>> "xyz" ++ "abc"
(++) "abc" "xyz"   >>> "abc" ++ "xyz"

但为什么,并且有任何文件谈论这个?

我继续使用“减法”功能进行测试。结果如我所料:

(subtract 10) (5) >>> -5
(subtract) 10 5   >>> -5

2 个答案:

答案 0 :(得分:9)

由于++是一个运算符,Haskell期望它处于中缀位置。在任何一方添加parens都会告诉Haskell将其视为前缀函数。这就是

的原因
(++) "abc" "xyz"      -- "abc" ++ "xyz"

按照它的方式工作。但是,在(++ "abc")("abc" ++)之类的运算符的一侧使用paren是一种特殊的称为section的东西 - 它实际上会生成一个函数来填充" 34;缺少的论点

(++ "abc")        -- equivalent to `\x -> x ++ "abc"`
("abc" ++)        -- equivalent to `\x -> "abc" ++ x`

然后,(++ "abc") ("xyz")相当于(\x -> x ++ "abc") ("xyz")相当于"xyz" ++ "abc"

答案 1 :(得分:0)

让我们从第二个开始吧。这是前缀表示法的情况。在这里,如果您了解使用运算符的prefix notation,您会看到结果“abcxyz”更直观。基本上,在操作表达式的这种表示中,操作符首先出现,然后是操作数序列,在这种情况下是两个操作数。因此,它将“abc”视为第一个操作数,将“xyz”视为第二个操作数,并以标准预期方式进行连接,即将第二个/右操作数添加到第一个/左操作数的右侧。

然而,第一个是 currying 的情况。基本上,串联(++),作为一个多参数函数可以同样表示为一系列一个参数函数,其中通过一次提供一个参数,我们正在转换我们需要n参数的原始函数(更好将Haskell中表示的“表达式”读入另一个带有n-1个参数的函数中。因此,这里原始的2参数函数(++)被转换为1参数函数(++“abc”)。现在,它可以被读作一个函数,它将“abc”附加到作为输入提供的任何字符串,这也由我们的输出确认。