在数学中,comprehension可以表示为从一个集合生成另一个集合:

{x²  |  x ∈ {1...5}}

Haskell中,list comprehension可以表示从一个list生成另外一个list

> [x^2 | x <- [1 .. 10], even x]
[4,16,36,64,100]

list comprehension可以包含两部分:x <- [1 .. 10]generator,表明x的值从哪里获得;even xguard,相当于限制哪些x的值可以用于生成新的listGeneratorguard都可以有多个,用,分开:

> [x * y | x <- [1 .. 10], y <- [1 .. 10], even x, odd y]
[2,6,10,14,18,4,12,20,28,36,6,18,30,42,54,8,24,40,56,72,10,30,50,70,90]

需要注意的是,改变generator的顺序会改变最后生成list的顺序。多个generator像嵌套循环,位置靠后的是里层循环,位置靠前的是外层循环。举例如下:

> [(x, y) | x <- [1, 2, 3], y <- [4, 5]]
[(1,4),(1,5),(2,4),(2,5),(3,4),(3,5)]
> [(x, y) | y <- [4, 5], x <- [1, 2, 3]]
[(1,4),(2,4),(3,4),(1,5),(2,5),(3,5)]

参考资料:
List Comprehensions