Diagonalising list comprehensions[ exp // qualifiers ] Syntax and scope rules exactly as for standard list comprehensions, the only difference being the use of `//' in place of the vertical bar. The order of enumeration of the generators is such that it is guaranteed that every possible combination of values will be reached eventually. The diagonalisation algorithm used is "fair" in the sense that it gives equal priority to all of the generators. For example the value of [f x y//x<-[1..4]; y<-[1..4]] is [ f 1 1, f 1 2, f 2 1, f 1 3, f 2 2, f 3 1, f 1 4, f 2 3, f 3 2, f 4 1, f 2 4, f 3 3, f 4 2, f 3 4, f 4 3, f 4 4 ] The algorithm used used is "Cantorian diagonalisation" - imagine the possible combinations of values from the two generators laid out in a (perhaps infinite) rectangular array, and traverse each diagonal in turn starting from the origin. The appropriate higher-dimensional analogue of this algorithm is used for the case of a list comprehension with three or more generators. As an example of an enumeration that could not be defined at all using a standard list comprehension, because of the presence of several infinite generators, here is a definition of the list of all pythagorean triangles (right-angled triangles with integer sides) pyths = [(a,b,c)//a,b,c<-[1..];a^2+b^2=c^2] In the case that there is only one generator, the use of `//' instead of `|' makes no difference to the meaning of the list comprehension.