Простая функция Фибоначчи Хаскелла застревает

#haskell #fibonacci

#haskell #фибоначчи

Вопрос:

Я запускаю консоль GHCi и набираю

 fib 0 = 0
fib 1 = 1
fib n = fib (n-1)   fib (n-2)
  

и затем

 fib 5
  

и консоль зависает и умирает с:

: Не хватает памяти

Что я делаю не так?

Ответ №1:

На консоли вы не определили ни одной функции fib с тремя разными регистрами; вы сначала определили fib 0 = 0 , затем перезаписали ее новой функцией fib 1 = 1 , затем, наконец, третьей функцией fib n = fib (n-1) fib (n-2) , у которой нет базового регистра. Вы можете использовать

 > fib 0 = 1; fib 1 = 1; fib n = fib (n-1)   fib (n-2)
  

чтобы правильно определить единственную функцию с тремя регистрами.

Обратите внимание, что это в первую очередь проблема, начиная с GHCi 8, поскольку в предыдущих версиях вам пришлось бы использовать let для запуска определения и вы получили бы ошибку синтаксического анализа во второй строке:

 > let fib 0 = 0
> fib 1 = 1

<interactive>:3:7: parse error on input '='
  

Ответ №2:

При вводе объявлений отдельно в ghci каждое из них читается как отдельное определение fib , затеняющее своих предшественников. Другими словами, вы эффективно работаете

 fib n = fib (n-1)   fib (n-2)
fib 5  -- infinite recursion here
  

Самый простой способ избежать этой проблемы — поместить определение fib в файл.