-- alist analogue of Data.Map.insertWith insertWith :: Eq k => (a -> a -> a) -> k -> a -> [(k, a)] -> [(k, a)] insertWith _ key val [] = [(key, val)] insertWith f key val (x@(k, v):xs) = if k == key then (key, f val v) : xs else x : insertWith f key val xs frequencies :: (Eq a) => [a] -> [(a, Int)] frequencies = foldr updateCounts [] where updateCounts c = insertWith (+) c 1 main = getContents >>= print . frequencies