今天我在玩>>=
,试图理解monad,并发现了一个有趣的模式。在处理列表monad时,>>=
似乎表现得像concatMap。我四处搜寻,试图找出任何相似之处,特别注意hackage的定义。>> =和concatMap之间的区别
有些事情我想:
[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] => [1,6,11,16,21,2,7,12,17,22,3,8,13,18,23]
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
的推广吗?
见https://en.wikibooks.org/wiki/Haskell/Understanding_monads/List的执行情况进行深入的解释Monad的列表类型。也是https://wiki.haskell.org/All_About_Monads#List_is_also_a_monad。 – bheklilr