Две функции Haskell ниже, по-видимому, различаются только тем, является ли индексная переменная неявной или явной, но разница в производительности на два порядка.
Эта функция занимает около 0,03 секунды для вычисления mfib 30:
let mfib = (map fib [0..] !!)
where
fib 0 = 0
fib 1 = 1
fib x = mfib (x-1) + mfib (x-2)
Эта функция занимает около 3 секунд для mfib 30:
let mfib i = map fib [0..] !! i
where
fib 0 = 0
fib 1 = 1
fib x = mfib (x-1) + mfib (x-2)
Я предполагаю, что это связано с встроенными правилами GHC и пытались добавить inline/noinline pragmas, чтобы получить соответствующую производительность.
EDIT: Я понимаю, как поиск в ленивом списке можно использовать для memoize функции fib и почему традиционное определение fib очень медленное. Я ожидал, что memoization будет работать во второй функции, а также в первой, и не понимаю, почему это не так.