(observe que estou colocando a pergunta aqui porque se trata da mecânica conceitual dela, e não de um problema de codificação)
Eu estava trabalhando em um pequeno programa, que usava uma sequência de números de fibonacci em sua equasão, mas notei que, se eu superasse um certo número, ele ficaria dolorosamente lento, pesquisando um pouco, encontrei uma técnica em Haskell conhecida como Memoization
: eles mostraram código funcionando assim:
-- Traditional implementation of fibonacci, hangs after about 30
slow_fib :: Int -> Integer
slow_fib 0 = 0
slow_fib 1 = 1
slow_fib n = slow_fib (n-2) + slow_fib (n-1)
-- Memorized variant is near instant even after 10000
memoized_fib :: Int -> Integer
memoized_fib = (map fib [0 ..] !!)
where fib 0 = 0
fib 1 = 1
fib n = memoized_fib (n-2) + memoized_fib (n-1)
Então, minha pergunta para vocês é: como ou melhor, por que isso funciona?
É porque, de alguma maneira, ele consegue percorrer a maior parte da lista antes que o cálculo o recupere? Mas se o haskell é preguiçoso, não há realmente nenhum cálculo que precise ser alcançado ... Então, como isso funciona?
the calculation catches up
? BTW, memoization não é específico para Haskell: en.wikipedia.org/wiki/Memoization