import System (getArgs) import Data.FiniteMap import Data.Array.Unboxed import Maybe type Key = UArray Int Char type Map = FiniteMap (UArray Int Char) Int hash1, hash2 :: Map hash1 = listToFM $ zip keys [0..9999] hash2 = listToFM $ zip keys (repeat 0) keys :: [Key] keys = map (\x -> listArray (1,4+length (show x)) ("foo_" ++ show x)) [0..9999] get :: Map -> Key -> Int get fm k = fromJust $ lookupFM fm k update :: Key -> Map -> Map update k fm = let x = (get hash1 k + get fm k) in x `seq` addToFM fm k x foo_1 = keys!!1 foo_9999 = keys!!9999 main = do [n] <- getArgs let res = foldr update hash2 (concat $ replicate (read n) keys) putStrLn $ unwords $ map show [get hash1 foo_1, get hash1 foo_9999, get res foo_1, get res foo_9999]