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