Прочитав введение в мемоизацию , я повторно реализовал пример Фибоначчи, используя более общую функцию мемоизации (только в целях обучения ):
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)
Где принципиальная разница с.р.т. для запоминания?