import Control.Monad



powerset :: [a] -> [[a]]

powerset = filterM (const [True, False])

powerset [1,2,3]

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

filterM

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

Beautiful Haskell implementation of math's "power set":AndproducesOh man is that hard for me to grok, mostly because I haven't internalized the list monad.(It helped me to write out the definition of, which has type.)But roughly, it's saying "for each assignment of true and false over the values of the list, grab the true values".[via Adam Langley via a private mailing list]