У меня есть следующий, часто цитируемый код для вычисления n-го числа Фибоначчи в Haskell:
fibonacci :: Int -> Integer
fibonacci = (map fib [0..] !!)
where fib 0 = 0
fib 1 = 1
fib n = fibonacci (n-2) + fibonacci (n-1)
Используя это, я могу делать такие вызовы, как:
ghci> fibonacci 1000
и получите почти мгновенный ответ.
Однако, если я изменю приведенный выше код так, чтобы он не был в свободном стиле, т.е.
fibonacci :: Int -> Integer
fibonacci x = (map fib [0..] !!) x
where fib 0 = 0
fib 1 = 1
fib n = fibonacci (n-2) + fibonacci (n-1)
он значительно медленнее. В той мере, в какой вызов, например
ghci> fibonacci 1000
зависаний.
Мое понимание заключалось в том, что эти две части кода были эквивалентны, но GHCi требует отличия. Кто-нибудь объясняет это поведение?