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]

Let's not calculate ys for a second, but go directly to the return function.

return (if [True, False] then x:ys else ys)

I expect the above code to throw a "Couldn't match expected type `Bool' with actual type `[Bool]'"

So I can't see how the trick works! Any hint?