fork download
  1. -- alist analogue of Data.Map.insertWith
  2. insertWith :: Eq k => (a -> a -> a)
  3. -> k
  4. -> a
  5. -> [(k, a)]
  6. -> [(k, a)]
  7. insertWith _ key val [] = [(key, val)]
  8. insertWith f key val (x@(k, v):xs)
  9. = if k == key
  10. then (key, f val v) : xs
  11. else x : insertWith f key val xs
  12.  
  13. frequencies :: (Eq a) => [a] -> [(a, Int)]
  14. frequencies = foldr updateCounts []
  15. where updateCounts c = insertWith (+) c 1
  16.  
  17. main = getContents >>= print . frequencies
  18.  
Success #stdin #stdout 0s 6296KB
stdin
Hello, World!
stdout
[('!',1),('d',1),('l',3),('r',1),('o',2),('W',1),(' ',1),(',',1),('e',1),('H',1)]