Переполнение стека при определении Haskell Фибоначчи - PullRequest
1 голос
/ 22 февраля 2020

Просто пытаясь выполнить упражнение 3.7 (стр. 31) из руководства YAHT Хала Дауме III, я попытался определить функцию Фибоначчи:

fibo 1 = 1
fibo 2 = 1
fibo n = fibo(n-1) + fibo(n-2)

Затем я запросил

fibo(3)

и получил:

*** Exception: stack overflow

Когда я посмотрел на решение упражнения, я нашел точно такой же код (с той разницей, что функция называется fib, а не fibo). Что я делаю не так?

(руководство написано в 2006 году, может быть, язык изменился между ними?) (Ирония c, что я спрашиваю stackoverflow о проблеме переполнения стека…)

1 Ответ

8 голосов
/ 22 февраля 2020

Вероятно, это результат определения функции в ghci по одной строке за раз. Это означает, что вы сначала определяете функцию fibo 1 = 1. Затем вы определяете другую функцию с именем fibofibo 2 = 2), которая имеет более локальную область видимости, и, наконец, вы определяете третью функцию с именем fibo.

. многострочные функции между :{ и :} и, таким образом, определяют одну функцию fibo, которая состоит из трех пунктов:

Prelude> <b>:{</b>
Prelude| fibo 1 = 1
Prelude| fibo 2 = 1
Prelude| fibo n = fibo (n-1) + fibo (n-2)
Prelude| <b>:}</b>
Prelude> fibo 3
2
...