
Luke Palmer wrote:
On Thu, Jun 18, 2009 at 9:55 PM, Ross Mellgren
mailto:rmm-haskell@z.odi.ac> wrote: It looks offhand like you're not being strict enough when you put things back in the IORef, and so it's building up thunks of (+1)...
With two slight mods:
go 0 = return () go n = do modifyIORef ior (+1) go (n-1)
-->
go 0 = return () go n = do modifyIORef ior (\ x -> let x' = x+1 in x `seq` x') go (n-1)
Just a slight prettification of that line:
modifyIORef ior ((1+) $!)
Or applied prefix if you prefer. Prefix ($!) has the nice interpretation as the HOF that makes its argument into a strict function.
Luke
do modifyIORef ior (\ x -> let x' = x+1 in x `seq` x') and do modifyIORef ior ((1+) $!) both still leak memory for me. However, do x <- readIORef ior writeIORef ior $! x+1 runs in constant space. I was able to fix my original program, and now it uses a predictable amount of memory. Thanks! -jim