2017-04-12 6 views
2

今日はモナドを理解しようとすると、>>=と一緒に遊んでいて面白いパターンを見つけました。リストモナドで作業するとき、>>=は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の一般化ですか?

+0

は、実装の詳細な説明についてはhttps://en.wikibooks.org/wiki/Haskell/Understanding_monads/Listを参照してください。リストタイプのMonadのまた、https://wiki.haskell.org/All_About_Monads#List_is_also_a_monad。 – bheklilr

答えて

5

はい、はリストの場合はconcatMapです。 >>=は、任意のモナドに対してfmapjoin(一般化concat)の組み合わせに過ぎないため、直感的にも意味があります。

+0

参加についてのお礼をありがとう、私は本当にそれを実現したことはありません! –

9

はい、引数を反転します。特別なリストの構文は干渉するものの、これらの型シグネチャを比較すると、類似性を引き出す必要があります。

Prelude> :t flip concatMap 
flip concatMap :: Foldable t => t a -> (a -> [b]) -> [b] 
Prelude> :t (>>=) 
(>>=)   :: Monad m => m a -> (a -> m b) -> m b 
+2

リスト形式のコンストラクタを接頭辞形式( 'Foldable t => ta - >(a - > [b] - > [] b')に書くのは合法です。それは、 []([] a) 'と' [[a]] ')。 –

関連する問題