<div dir="ltr">I'm looking at Bird's <i>Thinking Functionally with Haskell </i>and he gives two list comprehensions, asking under what conditions they deliver the same results<div><br></div><div><font face="monospace">[e | x <- xs, p x, y <- ys]<br>[e | x <- xs, y <- ys, p x]</font><br></div><div><br></div><div>First, I'm confused about what is the input and what is the predicate. The <font face="monospace">y <- ys</font> in the first LC seems to be in a predicate position, and in the second it's a second input after <font face="monospace">x <- xs</font> with <font face="monospace">p x</font> in the predicate position . . . confusing me.</div><div><br></div><div>The answer examples Bird gives are beyond me:</div><div><br></div><div>They deliver the same result only if ys is a finite list:</div><div><br></div><div><font face="monospace">> [1 | x <- [1,3], even x, y <- undefined]<br></font></div><div><font face="monospace">[]</font></div><div><font face="monospace">> [1 | x <- [1,3], y <- undefined, even x]<br></font></div><div><font face="monospace">Exception: Prelude.undefined<br></font></div><div><font face="monospace">> [1 | x <- [1,3], y <- [1..], even x]</font></div><div><font face="monospace">{Interruped}</font></div><div><br></div><div>I'm not sure what's being said here, or what points are being made.</div><div><br></div></div>