我对列表连接有疑问。函数加上加号(++)的工作与括号不同
(++ "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
答案 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”附加到作为输入提供的任何字符串,这也由我们的输出确认。