「リストモナドの動作原理を考える」の続きで、guard の動作原理を考えてみます。 guard は、リスト内包表記では、こんな感じに書けます。 [x | x <- [1,2], x < 2] → [1] これを do で書き直すと、こうなります。 do x <- [1,2] guard (x < 2) return x guard の定義は、Contorol.Monad の中にあって、こういう風になっています。 guard :: (MonadPlus m) => Bool -> m () guard True = return () guard False = mzero 僕には return () が何を意味するのか、さっぱり分かりませんでした。 do から >>= へ変形 上記の do を >>= へ変形するとこうなります。 [1,2] >>= (\x -> guard (x < 2)