[Haskell-cafe] Nice way to calculate character frequency in a string

Scherrer, Chad Chad.Scherrer at pnl.gov
Wed Oct 26 12:50:34 EDT 2005


Sorry to drag this thread out, but here's one more thing you might
try...

I was thinking, if we just wanted something like
intTable :: [Int] -> [(Int, Int)]
we could just replace Map with IntMap in the previous solution:

intTable xs = IntMap.assocs $! foldl' f IntMap.empty xs
    where f m x = let  m' = IntMap.insertWith (+) x 1 m
                       Just v = IntMap.lookup x m'
                  in v `seq` m'

To get another polymorphic version, we could just write this wrapper:

freq :: (Enum a) => [a] -> [(a,Int)]
freq = map fstToEnum . intTable . map fromEnum
    where fstToEnum (x,y) = (toEnum x, y)

This seems to run faster than the other polymorphic version on my
machine.

Chad Scherrer
Computational Mathematics Group
Pacific Northwest National Laboratory

"Time flies like an arrow; fruit flies like a banana." -- Groucho Marx


More information about the Haskell-Cafe mailing list