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