逆天
列表推導的另一個特徵是守衛,它也充當過濾器。防護是布林表示式,並在列表解析中顯示在欄的右側。
他們最基本的用途是
[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])