Haskell &燃气轮机>;=返回。。。什么';这是怎么回事?

Haskell &燃气轮机>;=返回。。。什么';这是怎么回事?,haskell,Haskell,我在读一篇关于exercism.io的文章,其中有人建议 concat (replicate n str) 也可以表示为: [1..n] >>= return str 没有进入随后关于这个主题的所有辩论:我正在寻找一个完全外行的解释,解释为什么/如何工作 特别是,在我试图在脑海中重铸这一点之后,我认为这可能有点类似于: fmap (return char) [1..3] 但我不明白的是为什么 [1..n] >>= return 'M' 是一个错误,在哪里 [1..

我在读一篇关于exercism.io的文章,其中有人建议

concat (replicate n str)
也可以表示为:

[1..n] >>= return str
没有进入随后关于这个主题的所有辩论:我正在寻找一个完全外行的解释,解释为什么/如何工作

特别是,在我试图在脑海中重铸这一点之后,我认为这可能有点类似于:

fmap (return char) [1..3]
但我不明白的是为什么

[1..n] >>= return 'M'
是一个错误,在哪里

[1..n] >>= return "M"
这很好

任何一个真正了解哈斯克尔的人能告诉我这一切是如何运作的吗

[1..n] >>= return str
这里的
return
来自函数monad(
(>)a
),因此上述内容相当于

[1..n] >>= const str
其中是一个忽略其参数并始终返回
str
的函数,
>=
是列表单子的绑定运算符,与我们得到的结果相同

concatMap (const str) [1..n]
它基本上用
str
替换每个列表元素,然后连接它们


至于为什么
[1..n]>=返回'M'
是一个错误:它简化为
concatMap(const'M')[1..n]
,但是
concatMap
的参数必须返回一个列表,
'M'
不是一个列表,而
“M”
(相当于
['M']
)是一个列表。

[1..n]>=返回str
[1..n]>>返回str
则返回str,但它相当于
复制n str
,不带concat。因此,无论哪种情况,你的问题的前提(即这是一个有效的替代品)首先是错误的。@SebastianRedl它进行类型检查-它只需要一个
Monad
实例作为
(>)r
,你可以通过导入
控件.Monad.Instances
。Simpler:
[1..n]>>str