You can also sift monomorphic containers using my class, which should probably be called MonoSiftable.data IntList = Cons !Int IntList | Nilinstance Siftable Int IntList wheresift _ Nil = Nilsift p (Cons x xs)| p x = Cons x (sift p xs)| otherwise = sift p xs