module Foo where import Monad import System.IO.Unsafe (unsafePerformIO) import Data.Array.MArray import Data.Array.IO import MyST hist f xs = do arr <- f $ newArray ('a','z') 0 flip mapM_ xs $ \x -> do n <- readArray arr x writeArray arr x (n+1) filter ((/=0) . snd) `liftM` getAssocs arr idSTArray :: ST s (STArray s i e) -> ST s (STArray s i e) idSTArray = id idIOArray :: IO (IOArray i e) -> IO (IOArray i e) idIOArray = id histST, histIO :: [Char] -> [(Char, Int)] histST xs = runST (hist idSTArray xs) histIO xs = unsafePerformIO (hist idIOArray xs)