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'' [] = []