做法
任何列表理解都可以使用 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 }