lazy evaluation - How do I force a function to be called immediately in Haskell? -
this code:
import data.function.memoize import debug.trace foo :: int -> int -> int foo = memofix foomemo foomemo f x = + (trace (show x) cont) cont = if x == 0 0 else x + f (x - 1) main = print $ foo 0 5 print $ foo 0 5 print $ foo 0 5
i expected print:
3 2 1 0 6 6 6
but, instead, prints this:
3 2 1 0 6 3 2 1 0 6 3 2 1 0 6
in other words, function not memoized expected be. because each time "foo 0" called, new memo-table created "foo". how can force ghc evaluate "memofix foomemo" once, doesn't create more 1 memotable?
the problem memotable created each parameter value, foo 0
etc., not whole of foo
. , memotables not shared 1 invocation of foo
next. solution make sure also memoize whole of foo
:
import data.function.memoize import debug.trace foo :: int -> int -> int foo = memoize foo1 foo1 = memofix foomemo foomemo f x = + (trace (show x) cont) cont = if x == 0 0 else x + f (x - 1) main = print $ foo 0 5 print $ foo 0 5 print $ foo 0 5
btw find following way of writing easier using memofix
:
foo :: int -> int -> int foo = memoize2 $ \a x -> let cont = if x == 0 0 else x + foo (x - 1) in + (trace (show x) cont)
Comments
Post a Comment