[Haskell-beginners] list monad and filterM
franco00 at gmx.com
franco00 at gmx.com
Fri Apr 6 16:58:02 CEST 2012
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?
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.haskell.org/pipermail/beginners/attachments/20120406/d9505ce3/attachment.htm>
More information about the Beginners
mailing list