Michael Weber wrote:
[I am reading ghc-bugs via the list archives, Cc'ing me would make me
see responses faster]
Here's a simple memoization function:
applyMemo :: (Eq a1,Show a1) => (a1 -> b) -> MVar [(a1,b)] -> (a1 -> b)
applyMemo f refTable x1 = unsafePerformIO $ do
-- print x1
table <- takeMVar refTable
let key = x1
case lookup key table of
Nothing -> do
let result = f x1
putMVar refTable $! (key,result):table
return result
Just memo -> putMVar refTable table >> return memo
The code above is a cut-down example. Initially, I tried to use
Data.HashTable, then IORef (Data.Map ...), then MVars. However, what
remains is that I get funny results: <<loop>>, "thread blocked
indefinitely", hangs, depending on the exact implementation of
applyMemo, whether I use ghci or ghc, and which function I memoize
(something with a more interesting call pattern than fib).
Would you mind submitting a complete test case that we can use to reproduce the
problem? We can probably reconstruct one from your description, but you
probably already have the code lying around.
Cheers,
Simon
_______________________________________________
Glasgow-haskell-bugs mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/glasgow-haskell-bugs