7

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

concat (replicate n str)

也可以表示为:

[1..n] >>= return str

无需深入讨论随后关于该主题的所有辩论:我正在寻找完全外行的解释为什么/如何工作。

特别是,在我试图在脑海中重新塑造这个之后,我认为它可能有点类似于:

fmap (return char) [1..3]

但我不明白为什么

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

是一个错误,其中

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

很好。

任何真正了解 Haskell 的人都可以带我了解这一切是如何工作的吗?

4

1 回答 1

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]但参数 toconcatMap必须返回一个列表并且'M'不是一个列表,而"M"(相当于['M'])是。

于 2013-11-13T16:27:47.123 回答