
On 7/18/07, Dougal Stanton
I worked out that [ (a,b) | a <- as, b <- bs ] must be equivalent to
comp = concatMap (\x -> map ((,) x) ys) xs
but I can't really say how conditions like "a /= b" get slotted in to that style. Is there a reference for that?
As I understand it, list comprehensions are equivalent to monadic expressions in the [] monad. The only trick is that conditions in the list comprehension have to be translated into guard expressions. For instance,
[(x,y) | x <- xs, y <- ys, x /= y]
translates into:
do x <- xs y <- ys guard (x /= y) return (x,y)
You're partway there - concatMap is flip (>>=), so you have the xs >>= (\x -> <stuff>) part. /g -- The man who'd introduced them didn't much like either of them, though he acted as if he did, anxious as he was to preserve good relations at all times. One never knew, after all, now did one now did one now did one.