[Haskell-cafe] Memoizing partially evaluated computations.

minh thu noteed at gmail.com
Wed Mar 18 07:06:26 EDT 2009

2009/3/18 Sebastiaan Visser <sfvisser at 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?


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

You can here : http://www.haskell.org/haskellwiki/Memoization


More information about the Haskell-Cafe mailing list