今天我在尝试理解单子的时候玩了一下 >>=
,发现了一个有趣的模式。当使用列表单子时,>>=
的行为看起来像是 concatMap。我搜索了一下 hackage 上的定义,试图找到任何相似之处。
我尝试了一些事情:
[1, 2, 3] >>= (iter 5 id) => [1,1,1,1,1,2,2,2,2,2,3,3,3,3,3]
concatMap (iter 5 id) [1, 2, 3]=> [1,1,1,1,1,2,2,2,2,2,3,3,3,3,3]
[1, 2, 3]通过(iter 5 (+5))迭代生成,结果为[1,6,11,16,21,2,7,12,17,22,3,8,13,18,23]。 使用concatMap (iter 5 (+5) ) [1, 2, 3]也可以得到相同的结果。 此处的iter函数是非无限迭代函数。
iter i f a = toL $ Data.Sequence.iterateN i f a
where
toL = Data.Foldable.toList :: Data.Sequence.Seq a -> [a]
(在repl.it中工作,因此导入出了问题)。
(>>=)
在列表中是否等同于concatMap
?
它是concatMap
的泛化吗?