pack :: (Eq a) => [a] -> [[a]] pack = foldr elim [] where elim e [] = [[e]] elim e p@(n:ns) | e == head n = (e:n):ns | otherwise = [e]:p pack' (x:xs) = let (first,rest) = span (==x) xs in (x:first) : pack' rest pack' [] = [] pack'' (x:xs) = (x:takeWhile (==x) xs):(pack'' $ dropWhile (==x) xs) pack'' [] = []