Bjorn Bringert wrote:
memory. Here is something I wrote, but it doesn't work :(


I must have been doing something really wrong that day, because today it works smoothly... :)


The code below seems to work for strings, and should be generalizable to any type for which you have a hash function:

import Data.HashTable as H
import System.IO.Unsafe (unsafePerformIO)

{-# NOINLINE stringPool #-}
stringPool :: HashTable String String
stringPool = unsafePerformIO $ new (==) hashString

{-# NOINLINE shareString #-}
shareString :: String -> String
shareString s = unsafePerformIO $ do
    mv <- H.lookup stringPool s
    case mv of
            Just s' -> return s'
            Nothing -> do
                       H.insert stringPool s s
                       return s


Very interesting, thanks!

It seems very similiar to your code, except that it uses HashTable instead of Map.

Question is: which one is better? My tupicall file contains 160000 tokens, where 95% is taken by about 20 tokens that are used very frequently.


/Björn

--
Gracjan
_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to