Почему не работает мемоизация?

Прочитав введение в мемоизацию , я повторно реализовал пример Фибоначчи, используя более общую функцию мемоизации (только в целях обучения ):

memoizer :: (Int -> Integer) -> Int -> Integer
memoizer f = (map f [0..] !!)

memoized_fib :: Int -> Integer
memoized_fib = memoizer fib
    where fib 0 = 0
          fib 1 = 1
          fib n = memoized_fib (n-2) + memoized_fib (n-1)

. Это работает, но когда я просто меняю последнюю строку на следующий код, мемоизация внезапно не работает, как я ожидал (программа снова начинает работать медленно):

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

Где принципиальная разница с.р.т. для запоминания?

7
задан H.B. 30 August 2012 в 18:09
поделиться