今日はモナドを理解しようとすると、>>=
と一緒に遊んでいて面白いパターンを見つけました。リストモナドで作業するとき、>>=
はconcatMapのように動作するように見えました。私はハックの定義を特に見て、類似点を見つけようと試みました。>>>と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