Solution (source code)

= Solution

All three <Haskell> definitions have \b[`filter :: (a -> Bool) -> [a] -> [a]`]. A recursive <list filter> is
``
filter p [] = []
filter p (x:xs)
  | p x       = x : filter p xs
  | otherwise = filter p xs
``
A <list comprehension> gives `filter p xs = [x | x <- xs, p x]`. A <right fold> gives
``
filter p = foldr (\x ys -> if p x then x:ys else ys) []
``
Each version retains the input order and needs no <equality> or <Haskell Ord class> constraint on the element type.