首页 > 解决方案 > GHCI:如何在 Prelude repl 上保存状态?

问题描述

我试图在前奏 repl 上执行斐波那契,但我遇到了一个无限循环:

Prelude> fib 0 = 1
Prelude> fib 1 = 1
Prelude> fib n = fib(n-1) + fib(n-2)
Prelude>
Prelude> fib 3
<loops infinitely...>

我该如何解决?

标签: haskell

解决方案


如果要在 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

值得注意的是,fib像这样实现为递归函数必然是时间效率低下的,通常最好将其定义为递归无限列表,如下所示:

Prelude> :{
Prelude| fib n = fibs !! n
Prelude|    where fibs = 1 : 1 : zipWith (+) fibs (tail fibs)
Prelude| :}
Prelude> fib 3
3

推荐阅读