Perhaps a list comprehension better shows the intention of the filter function: filter p xs = [x | x <- xs, p x] You can literally read that as "take all x from xs that satisfy p".