[Haskell-beginners] list monad and filterM

Brent Yorgey byorgey at seas.upenn.edu
Fri Apr 6 18:29:27 CEST 2012


On Fri, Apr 06, 2012 at 04:58:02PM +0200, franco00 at gmx.com wrote:
> I don't get this example ( from Learn you a Haskell http://learnyouahaskell.com/for-a-few-monads-more ). The question is about filterM and the List Monad
> 
>  > import Control.Monad ( filterM )
>  > powerset :: [a] -> [[a]] 
>  > powerset xs = filterM (\x -> [True, False]) xs 
> 
>  Looking into Control.Monad, filterM is defined:
> 
>  filterM :: (Monad m) => (a -> m Bool) -> [a] -> m [a]
>  filterM _ [] = return []
>  filterM p (x:xs) = do
>  flg <- p x
>  ys <- filterM p xs
>  return (if flg then x:ys else ys)
> 
>  Ok, let's do it step by step.
> 
>  > test = powerset [1,2,3]
> 
>  'p' (in the filterM function) is
> 
>  p = \x -> [True, False]
> 
>  so flg is [True, False]

No, flg is not [True, False].  <- is not assignment.  It gets
translated into a call to (>>=) (bind).  Given the way (>>=) works for
the list monad, flg will be first True, and then False.

-Brent



More information about the Beginners mailing list