在数学中,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 x
是guard
,相当于限制哪些x
的值可以用于生成新的list
。Generator
和guard
都可以有多个,用,
分开:
> [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。