
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