定义 Haskell 斐波纳契时堆栈溢出

Stack overflow when defining Haskell Fibonacci

只是尝试做 Hal Daumé III 的 YAHT 手册的练习 3.7(第 31 页),我尝试定义斐波那契函数:

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

然后我请求

fibo(3)

并得到:

*** Exception: stack overflow

当我查看练习的解决方案时,我发现了完全相同的代码(不同之处在于该函数称为 fib 而不是 fibo)。我做错了什么?

(手册是2006年的,中间语言可能有变化?) (讽刺的是我问Whosebug一个stack overflow的问题...)

这可能是一次在 ghci 中定义函数的结果。这意味着你首先定义了一个函数fibo 1 = 1。然后定义 另一个 名称为 fibo 的函数(带有 fibo 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