我正在阅读有关exercism.io的提交内容,其中有人建议
concat (replicate n str)
可以表示为:
[1..n] >>= return str
没有进入随后在这个问题上进行的所有辩论:我正在寻找一个完整的外行人解释为什么/如何运作的解释。
特别是在我试图重塑这一点之后,我认为它可能有点类似于:
fmap (return char) [1..3]
但我不明白的是为什么
[1..n] >>= return 'M'
是一个错误,其中
[1..n] >>= return "M"
很好。
任何真正熟悉Haskell的人都可以告诉我这一切是如何运作的吗?
答案 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"
)是。