[Haskell-cafe] Efficient functional idiom for histogram
Malcolm Wallace
malcolm.wallace at cs.york.ac.uk
Sat Aug 1 14:14:51 EDT 2009
> I'm expecting the answer to be that I've got unnecessary laziness -
> which
> is fine, but ultimately my interest is in ease of expression and
> performance combined, so I'm looking for beginner-level improvements
> rather than subtle advanced techniques like unboxing.
You're right, it is too lazy. Here are a couple of strictifications
that should help:
> histogram :: Ord a => [a] -> [(a,Int)]
> histogram = Map.assocs . foldl f Map.empty
> where
> f m k = Map.insertWith (+) k 1 m
Turn foldl into foldl' (from Data.List) and Map.insertWith into
Map.insertWith'.
The strict versions simply force the intermediate structures to be
evaluated, rather than hanging around as large accumulations of
closures.
Regards,
Malcolm
More information about the Haskell-Cafe
mailing list