定义 Haskell Fibonacci 时的堆栈溢出

yan*_*nis 1 stack-overflow haskell fibonacci

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

fibo 1 = 1
fibo 2 = 1
fibo n = fibo(n-1) + fibo(n-2)
Run Code Online (Sandbox Code Playgroud)

然后我要求

fibo(3)
Run Code Online (Sandbox Code Playgroud)

并得到:

*** Exception: stack overflow
Run Code Online (Sandbox Code Playgroud)

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

(手册是 2006 年的,可能中间语言变了?)(讽刺的是我问 stackoverflow 一个堆栈溢出的问题……)

Wil*_*sem 9

这可能ghci是一次在一行中定义函数的结果。这意味着您首先定义一个函数fibo 1 = 1。然后定义另一个具有更本地范围的名称fibo(with fibo 2 = 2) 的函数,最后定义第三个名为 的函数fibo

您可以在:{和之间包装多行函数:},从而定义一个fibo由三个子句组成的函数:

Prelude> :{
Prelude| fibo 1 = 1
Prelude| fibo 2 = 1
Prelude| fibo n = fibo (n-1) + fibo (n-2)
Prelude| :}
Prelude> fibo 3
2
Run Code Online (Sandbox Code Playgroud)