Haskell GHCI:如何在Prelude repl上保存状态?

Haskell GHCI:如何在Prelude repl上保存状态?,haskell,Haskell,我试图在prelude repl上执行斐波那契,但我遇到了一个无限循环: Prelude> fib 0 = 1 Prelude> fib 1 = 1 Prelude> fib n = fib(n-1) + fib(n-2) Prelude> Prelude> fib 3 <loops infinitely...> Prelude>fib 0=1 前奏曲>长句1=1 前奏曲>fib n=fib(n-1)+fib(n-2) 序曲> 前奏曲>第3小段 如何

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

Prelude> fib 0 = 1
Prelude> fib 1 = 1
Prelude> fib n = fib(n-1) + fib(n-2)
Prelude>
Prelude> fib 3
<loops infinitely...>
Prelude>fib 0=1
前奏曲>长句1=1
前奏曲>fib n=fib(n-1)+fib(n-2)
序曲>
前奏曲>第3小段

如何修复此问题?

如果要在GHCi中编写多行声明,需要将其包装在
:{:}
中,以便Haskell知道如何同时计算整个定义。现在要做的是定义一个函数
fib
,其中
fib 0
1
,然后定义一个新函数
fib
,该函数在
fib 1
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

如果要在GHCi中编写多行声明,需要将其包装在
:{:}
以便Haskell知道同时评估整个定义。您现在要做的是定义一个函数
fib
,其中
fib 0
1
,然后定义一个新函数
fib
,该函数将
fib 1
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