<div dir="ltr">Hi, <div><br></div><div>In the 'learnyouahaskell' online book the powerset function is described like this - </div><div><br></div><div>----</div><div><font face="monospace, monospace">powerset :: [a] -> [[a]]<br></font></div><div><font face="monospace, monospace">powerset xs = filterM (\x -> [True, False]) xs</font></div><div>----</div><div><br></div><div>And the filterM function is defined like this </div><div><br></div><div><font face="monospace, monospace">filterM :: (Monad m) => (a -> m Bool) -> [a] -> m [a]</font><br></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">--</font></div><div><br></div><div><font face="arial, helvetica, sans-serif">The filterM function is said to be an extension of 'filter' function which maps the monadic predicate over the given list. </font></div><div><font face="arial, helvetica, sans-serif"><br></font></div><div><font face="arial, helvetica, sans-serif">Now in powerset function the predicate returns a monad [True,False] for every element of the given list.</font></div><div><font face="arial, helvetica, sans-serif"><br></font></div><div><font face="arial, helvetica, sans-serif">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], []]. </font></div><div><font face="arial, helvetica, sans-serif"><br></font></div><div><font face="arial, helvetica, sans-serif">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 </font></div><div><br></div><div>[[1], [], [2], []] </div><div><br></div><div>But the powerset of [1,2] is definitely not that. </div><div><br></div><div>Please could someone help me in getting my head around with how filterM is working in this case.</div><div><br></div><div>Thanks,</div><div><div><div class="gmail_signature"><div dir="ltr"><font color="#0b5394"><font style="background-color:rgb(255,255,255)"><font size="2" face="georgia, serif">Shishir</font></font><br></font><br></div></div></div>
</div></div>