定义 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
只是尝试做 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