compress :: (Eq a) => [a] -> [a] compress = foldr elim [] where elim e [] = [e] elim e ns | e == head ns = ns | otherwise = e:ns compress' xs = foldr f (const []) xs Nothing where f x r a@(Just q) | x == q = r a f x r _ = x : r (Just x)