逆天

列表推導的另一個特徵是守衛,它也充當過濾器。防護是布林表示式,並在列表解析中顯示在欄的右側。

他們最基本的用途是

[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])