我试图在 prelude repl 上执行 fibonacci,但我遇到了一个无限循环:
Prelude> fib 0 = 1
Prelude> fib 1 = 1
Prelude> fib n = fib(n-1) + fib(n-2)
Prelude>
Prelude> fib 3
<loops infinitely...>
Run Code Online (Sandbox Code Playgroud)
我该如何解决?
如果要在 GHCi 中编写多行声明,则需要将其包装起来,:{ :}以便 Haskell 知道同时评估整个定义。你现在正在做的是定义一个函数fibwhere fib 0is 1,然后定义一个新函数fib来遮蔽第一个 where fib 1is 1,然后定义一个遮蔽第二个的第三个函数,这是 Haskell 在尝试时看到的唯一定义执行fib 3。解决方案是告诉 GHCi 这都是相同的定义,这是使用:{命令完成的:
Prelude> :{
Prelude| fib 0 = 1
Prelude| fib 1 = 1
Prelude| fib n = fib (n - 1) + fib (n - 2)
Prelude| :}
Prelude> fib 3
3
Run Code Online (Sandbox Code Playgroud)
值得注意的是,fib像这样实现为递归函数肯定是时间效率低下的,通常最好将其定义为递归无限列表,如下所示:
Prelude> :{
Prelude| fib n = fibs !! n
Prelude| where fibs = 1 : 1 : zipWith (+) fibs (tail fibs)
Prelude| :}
Prelude> fib 3
3
Run Code Online (Sandbox Code Playgroud)