<div dir="ltr">I'm in Bird's <i>Thinking Functionally with Haskell</i> and the topic is natural transformations. He says<div><br></div><div><font face="monospace">filter p . map f = map f . filter (p . f)</font></div><div><br></div><div>and he has a proof, but one step of the proof he goes from</div><div><br></div><div><font face="monospace">filter p . map f = concat . map (map f) . map (test (p . f))</font><br></div><div><br></div><div>to </div><div><br></div><div><font face="monospace">filter p . map f = map f . concat . map (test (p . f))<br></font></div><div><br></div><div>which means </div><div><br></div><div><font face="monospace">concat . map (map f) => map f . concat<br></font></div><div><br></div><div>which means</div><div><br></div><div><font face="monospace">map (map f) = map f</font></div><div><br></div><div>... or I'm getting this step wrong somehow. To begin with, I'm having a hard time comprehending <font face="monospace">map(map f)</font>, Any ideas on how this is possible?</div><div><br></div><div>LB</div><div><br></div><div><br></div><div><br></div><div><br></div></div>