+frequency :: [Integer] -> [(Integer, Integer)]
+frequency xs = M.toList $ M.fromListWith (+) ([(c,1) | c <- xs] ++
+ [(c,0) | c <- [0..9]])
+numStars :: Integer -> String
+numStars n = take (fromInteger n) (repeat '*')
+
+numSpaces :: Integer -> String
+numSpaces n = take (fromInteger n) (repeat ' ')
+
+histogram' xs = let freqs = [b | (_,b) <- frequency xs]
+ m = maximum freqs
+ in
+ reverse $ L.transpose $ [take (fromInteger m) (numStars b ++ numSpaces (10 - b)) | b <- freqs]
+
+histogram :: [Integer] -> String
+histogram xs = (L.concat $ L.intersperse "\n" $ histogram' xs) ++ "\n"
+ ++ replicate 10 '=' ++ "\n" ++ (L.concat $ map show [0..9]) ++ "\n"