逆天
列表推导的另一个特征是守卫,它也充当过滤器。防护是布尔表达式,并在列表解析中显示在栏的右侧。
他们最基本的用途是
[x | p x] === if p x then [x] else []
防护中使用的任何变量必须出现在其理解中的左侧,否则必须在范围内。所以,
[ f x | x <- list, pred1 x y, pred2 x] -- `y` must be defined in outer scope
这相当于
map f (filter pred2 (filter (\x -> pred1 x y) list)) -- or,
-- ($ list) (filter (`pred1` y) >>> filter pred2 >>> map f)
-- list >>= (\x-> [x | pred1 x y]) >>= (\x-> [x | pred2 x]) >>= (\x -> [f x])
(>>=
运算符是 infixl 1
,即它将(括号内)与左侧相关联)。例子:
[ x | x <- [1..4], even x] -- [2,4]
[ x^2 + 1 | x <- [1..100], even x ] -- map (\x -> x^2 + 1) (filter even [1..100])