Because expressions are treated as guards in list comprehensions. I.e.: [ foo | x <- a, b, y <- c, d ] Is interpreted as: do x <- a guard b y <- c guard d return foo Luke