haskell - 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...>
我该如何解决?
解决方案
如果要在 GHCi 中编写多行声明,则需要将其包装起来,:{ :}
以便 Haskell 知道同时评估整个定义。你现在正在做的是定义一个函数fib
where fib 0
is 1
,然后定义一个新函数fib
来隐藏第一个 where fib 1
is 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
推荐阅读
- clickhouse - ClickHouse 日志显示未压缩文件的哈希值不匹配
- arrays - 获取特定键的值
- r - 带有多重插补 + 多级模型 + 稳健标准误差的“向量内存耗尽”
- python - PyInstaller + Asyncpg:无法导入名称异常
- python - vscode 中有什么扩展可以让我在键入一个函数时看到函数提示?
- python - pandas 数据帧排名的顺序与原始数据帧的顺序不匹配
- c - 如何解决共享模块的全局变量问题?
- javascript - 反应功能状态未定义 no-undef
- python - 在不同的 html 标记中使用 _ngcontent 值抓取网页
- arrays - 打印缺失值