(tenga en cuenta que estoy haciendo la pregunta aquí porque se trata de la mecánica conceptual de la misma, en lugar de un problema de codificación)
Estaba trabajando en un pequeño programa, que usaba una secuencia de números de Fibonacci en su ecuación, pero noté que si superaba un cierto número se volvía dolorosamente lento, buscando en Google un poco me topé con una técnica en Haskell conocida como Memoization, mostraron código que funciona así:
-- 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)
Entonces mi pregunta para ustedes es, ¿cómo o más bien por qué funciona esto?
¿Es porque de alguna manera logra ejecutar la mayor parte de la lista antes de que el cálculo se ponga al día? Pero si Haskell es vago, no hay realmente ningún cálculo que deba ponerse al día ... Entonces, ¿cómo funciona?
the calculation catches up? Por cierto, la memorización no es específica de haskell: en.wikipedia.org/wiki/Memoization