dvde: > Don Stewart schrieb: >> dvde: >> >>> Don Stewart schrieb: >>> >>>> It is not possible to write a modifyIORef that *doesn't* leak memory! >>>> >>> Why? Or can one read about it somewhere? >>> >> >> >> Try writing a version of this program, using modifyIORef only, such >> that it doesn't exhaust the heap: >> >> import Data.IORef >> import Control.Monad >> import System.IO.Unsafe >> >> ref :: IORef Int >> ref = unsafePerformIO $ newIORef 0 >> {-# NOINLINE ref #-} >> >> main = do >> modifyIORef ref (\a -> a + 1) >> main >> >> Run it in a constrained environment, so you don't thrash: >> >> $ ./A +RTS -M100M >> Heap exhausted; >> Current maximum heap size is 99999744 bytes (95 MB); >> use `+RTS -M<size>' to increase it. >> >> The goal is to run in constant space. >> >> -- Don >> >> > Hm, do you say it is not possible to write a modifyIORef function that > does not leak memory, or do you say it is not possible to use the > (existing) modifyIORef without having memory leaks?
The latter. atomicModifyIORef is harder though still, since it is a primop with the same properties as modifyIORef :/ > So would it make sense to create a strict modifyIORef' function? Very much so. In fact, I'd argue the vast majority of uses are for the WHNF-strict version. -- Don _______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe