filter p xs = [ x | x <- xs, p x]
>>> filter odd [1, 2, 3] [1,3]
>>> filter (\l -> length l > 3) ["Hello", ", ", "World", "!"] ["Hello","World"]
>>> filter (/= 3) [1, 2, 3, 4, 3, 2, 1] [1,2,4,2,1]
runIdentity (filterM (Identity . p) xs) == filter p xs
>>> filterM (\x -> do
putStrLn ("Keep: " ++ show x ++ "?")
answer <- getLine
pure (answer == "y"))
[1, 2, 3]
Keep: 1?
y
Keep: 2?
n
Keep: 3?
y
[1,3]
>>> filterM (\x -> do putStr (show x) x' <- readLn pure (x == x')) [1, 2, 3] 12 22 33 [2,3]