On Thu, Jun 18, 2009 at 9:55 PM, Ross Mellgren <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