Hi, 

In the 'learnyouahaskell' online book the powerset function is described like this - 

----
powerset :: [a] -> [[a]]
powerset xs = filterM (\x -> [True, False]) xs
----

And the filterM function is defined like this 

filterM :: (Monad m) => (a -> m Bool) -> [a] -> m [a]

--

The filterM function is said to be an extension of 'filter' function which maps the monadic predicate over the given list. 

Now in powerset function the predicate returns a monad [True,False] for every element of the given list.

So for e.g. if the input list was only [1] the output of filterM will understandably be the cartesian product of [True, False] x [1] = [[1], []]. 

Extending this if the given input list contains two elements [1,2] the predicate would be mapped one by one on each of the elements and the result combined which means the output should be 

[[1], [], [2], []] 

But the powerset of [1,2] is definitely not that. 

Please could someone help me in getting my head around with how filterM is working in this case.

Thanks,
Shishir