>> =返回......这里发生了什么?

时间:2013-11-13 16:17:32

标签: haskell

我正在阅读有关exercism.io的提交内容,其中有人建议

concat (replicate n str)

可以表示为:

[1..n] >>= return str

没有进入随后在这个问题上进行的所有辩论:我正在寻找一个完整的外行人解释为什么/如何运作的解释。

特别是在我试图重塑这一点之后,我认为它可能有点类似于:

fmap (return char) [1..3]

但我不明白的是为什么

[1..n] >>= return 'M'

是一个错误,其中

[1..n] >>= return "M"

很好。

任何真正熟悉Haskell的人都可以告诉我这一切是如何运作的吗?

1 个答案:

答案 0 :(得分:14)

[1..n] >>= return str

此处return来自函数monad((->) a),因此上述内容相当于

[1..n] >>= const str

其中const是忽略其参数并始终返回str>>=的函数,是列表monad的绑定运算符,与concatMap相同所以我们得到

concatMap (const str) [1..n]

基本上用str替换每个列表元素,然后将它们连接起来。

至于为什么[1..n] >>= return 'M'是一个错误:它减少到concatMap (const 'M') [1..n]但是concatMap的参数必须返回一个列表而'M'不是列表,而{{{} 1}}(相当于"M")是。