Two solutions using immutable and mutable arrays and no unsafe operations:

----
module Main where
import Control.Monad.ST
import Data.Ix
import Data.Array
import Data.Array.MArray
import Data.Array.ST


-- using immutable arrays
hist1 :: String -> Array Char Int
hist1 str = accumArray (+) 0 ('\0','\255') [(c,1) | c<-str]
 

freq1 :: String -> [(Char,Int)]
freq1 = assocs . hist1


-- using mutable ST arrays
hist2 :: String -> STArray s Char Int -> ST s ()
hist2 str arr = sequence_ [do { i<-readArray arr c; writeArray arr c (1+i) }
                          | c<-str]

freq2 :: String -> [(Char,Int)]
freq2 str = runST (do { arr<-newArray ('\0', '\255') 0
                      ; hist2 str arr
                      ; getAssocs arr
                      })

--

Cheers,

Pedro
_______________________________________________
Haskell-Cafe mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to