On Mar 18, 2009, at 12:06 PM, minh thu wrote:
2009/3/18 Sebastiaan Visser <[email protected]>:
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).
The problem is that the `timeConsumingPureOperation' is somewhere very
deep inside my code at a point I cannot alter. Like this:
> -- This I can change:
> myIOCode = forever (deepLibraryCode >>= print)
>
> -- This I cannot change:
> deepLibraryCode :: IO Int
> deepLibraryCode = makeIOfunctionFrom timeConsumingPureOperation
The separation between the make `makeIOfunctionFrom' and
`timeConsumingPureOperation' might not even be that clear as in my
example.
That is why I am looking for some high level way of memoizing.
You can here : http://www.haskell.org/haskellwiki/Memoization
HTH,
Thu
_______________________________________________
Haskell-Cafe mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/haskell-cafe