[Haskell-cafe] Nice way to calculate character frequency in a
string
Jon Fairbairn
Jon.Fairbairn at cl.cam.ac.uk
Tue Oct 25 06:59:29 EDT 2005
On 2005-10-25 at 12:20+0200 Lemmih wrote:
> On 10/25/05, Charles SDudu <iwin_1 at hotmail.com> wrote:
> > Hello, I need to calculate the frequency of each
> > character in a String. And if I can do this really well
> > in C, I dont find a nice (and fast) answer in haskell. I
> > tried several functions, listed below, and even the
> > fastest do a lot of unnecessary things :
> >
> > calc :: String -> [ (Char, Int) ]
> > calc = filter (\p -> snd p > 0) . assocs .
> > foldl (\k c -> unsafeReplace k [(fromEnum c, (unsafeAt k (fromEnum c))+1)]
> > ) k
> > where k = array (toEnum 0, toEnum 255) [(toEnum i, 0) | i <- [0 .. 255]]
> > :: UArray Char Int
[snip even more disagreable code]
Ugh! These are all horrid. If something on the lines of
> calc = accumArray (+) 0 (minBound, maxBound) . (map (\x->(x,1)))
isn't fast enough, complain to the implementors! What's the
point of functional programming if one has to twist into a
shape that allows inspection of one's own fundament to get
stuff to run in decent time?
Jón
--
Jón Fairbairn Jon.Fairbairn at cl.cam.ac.uk
More information about the Haskell-Cafe
mailing list