[Haskell-cafe] Memo + IORef
Benja Fallenstein
benja.fallenstein at gmail.com
Sat Jun 16 07:17:42 EDT 2007
Hi Tony,
2007/6/16, Tony Morris <tmorris at tmorris.net>:
> I was told on #haskell (IRC) the other day that it is possible to write
> a general memoisation table using IORef and unsafePerformIO. I can't
> think of how this can be achieved without writing to a file, since a
> function cannot hold state between invocations. What am I missing?
You create a single IORef for the function (via unsafePerformIO), for
example like this:
memoTable :: Map Int Int
memoTable = unsafePerformIO $ newIORef Map.empty
memoizedFactorial n = unsafePerformIO $ do
tbl <- readIORef memoTable
if (n `Map.member` tbl) then return (tbl Map.! n) else do
let r = if n == 0 then 1 else n * memoizedFactorial (n-1)
writeIORef memoTable $ Map.insert n r tbl
return r
- Benja
More information about the Haskell-Cafe
mailing list