[Haskell-cafe] [newbie question] Memoization automatic in Haskell?

jerzy.karczmarczuk at info.unicaen.fr jerzy.karczmarczuk at info.unicaen.fr
Sun Jan 13 05:27:12 EST 2008


Henning Thielemann writes: 

> Caching is not the default, but you can easily code this by yourself:
> Define an array and initialize it with all function values. Because of
> lazy evaluation the function values are computed only when they are
> requested and then they persist in the array.
>  One should add this most simple case to the Wiki.

A posteriori thought, when I reread that... 

This is a =part= of the story. Whatever you do with the initial calls, if
there is no automatic memoization, further calls will be executed normally.
The user has to replace his/her calls with the elements of the memo-array. 

Suppose (sorry for the awful Fibonacci again...) we define 

fibs = [fib n | n<-[0 ..]] 

fib 0 = 0
fib 1 = 1
fib n = fib(n-1) + fib(n-2) 

If you try to get fibs!!1000 you will die before anyway. 

The solution is obviously to replace the recursive definition of fib by 

fib n = fibs!!(n-1) + fibs!!(n-2) 

This works well. I had a similar problem in physics, perturbation theory
offers often some quite intricate, knotty recurrencies, and the memoization
offers a solution for the worse than exponential complexity. But I had to
use trees, 2_dim lists of lists, etc. in order to sort the order of the
creation of the results appropriately.
So, I agree wholeheartly with the statement that memoization is not a blind
automaton, it should be used consciously, and adapted to concrete needs. 

Jerzy Karczmarczuk 




More information about the Haskell-Cafe mailing list