2009/3/18 Sebastiaan Visser <sfvis...@cs.uu.nl>: > Suppose I have a list of IO computations that depends on a few very time > consuming pure operations. The pure operations are not dependent on the real > world: > >> computation :: [IO Int] >> computation = [ >> smallIOfunc timeConsumingPureOperation0 >> , smallIOfunc timeConsumingPureOperation1 >> , smallIOfunc timeConsumingPureOperation2 >> , smallIOfunc timeConsumingPureOperation3 >> ] >> where smallIOfunc a = print a >> return a > > In my main function I would like to repeatedly print the values > >> main = forever $ >> sequence_ (map (>>=print) computation) > > When I do this, all the time consuming operations will be reevaluated every > run of the main loop. Is there a any (simple or smart) way to prevent the > garbage collector from cleaning up the fully evaluated thunks inside my > computation? As if it were something like this: > >> computation :: [IO Int] >> computation = [smallIOfunc 42, smallIOfunc 34385, smallIOfunc 3, >> smallIOfunc 55] > > Of course I could plugin some kind of Int memoizer inside my computation, > but I do not really have the control to change things `deep' inside the > code. I want to have some form of snapshot of a list of partially evaluated > IO computations... > > Any suggestions?
Hi, If timeConsumingPureOperation is pure, the problem is thus not related to IO, and your question remains the same : how to memoize timeConsumingPureOperation for some arguments. Since you want to repeatidly call main, it seems a good idea to wrap your pure operation in a memoizing CAF (and give the wrapped version to smalIOFuncf). You can here : http://www.haskell.org/haskellwiki/Memoization HTH, Thu _______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe