На Haskell wiki я прочитал, что это:
fib =
let fib' 0 = 0
fib' 1 = 1
fib' n = fib (n - 1) + fib (n - 2)
in (map fib' [0 ..] !!)
более эффективен, чем это:
fib x =
let fib' 0 = 0
fib' 1 = 1
fib' n = fib (n - 1) + fib (n - 2)
in map fib' [0 ..] !! x
Потому что "во втором случае fib" (re) определяется для каждого аргумента x, поэтому его нельзя выгрузить ".
Я не понимаю, что это значит.
- Что означает "выплывание"? Как это оптимизация?
- Почему
fib'
переопределяется для каждого вызоваfib
? - Является ли это расширением eta или нет?