做法

任何列表理解都可以使用 list monad 的 do 表示法進行相應的編碼。

[f x | x <- xs]                 f  <$> xs         do { x <- xs ; return (f x) }

[f x | f <- fs, x <- xs]        fs <*> xs         do { f <- fs ; x <- xs ; return (f x) }

[y   | x <- xs, y <- f x]       f  =<< xs         do { x <- xs ; y <- f x ; return y }

警衛可以使用處理 Control.Monad.guard

[x   | x <- xs, even x]                           do { x <- xs ; guard (even x) ; return x }