【问题标题】:Deleting an infinite list in Haskell在 Haskell 中删除无限列表
【发布时间】:2018-01-14 19:53:56
【问题描述】:

我刚刚开始使用 Haskell。我读到我们可以用 [0..] 生成正自然数的无限列表,并尝试了一下。

但是,现在我无法回到文件的开头。我已经删除了很多数字,但是我怎样才能摆脱这个无限的数字列表呢?

【问题讨论】:

  • 什么意思?您不能从无限列表中删除数字。 Haskell 中的数据是不可变的...
  • @Lukelindenbaum: 但ghci 只是一个打印到标准输出的交互式外壳...这取决于您的终端配置您可以向后滚动多少...但是您可以使用箭头键浏览您的历史记录。
  • @Lukelindenbaum do ctrl + c 停止打印无限的数字列表
  • 这与你的代码或程序的状态无关。
  • @Lukelindenbaum:这不是文件,而是外壳。一个 shell 打印到标准输出。 终端 是处理输入/输出并将其显示在屏幕上的程序。一些终端允许存储任意数量的行,而其他终端则不允许,在这种情况下,一旦生成过多的输出,这些行就会丢失。这与 Haskell 或 ghci 无关,只是终端的工作方式。

标签: list shell haskell


【解决方案1】:

这与 Haskell 和 GHCi 无关,更多地与 OS shell 的工作方式有关。当您执行打印无限列表时,您指示计算机继续将更多字节放入屏幕缓冲区。那些容量有限,最终会丢失之前命令放入的数据。

为避免将来出现此类情况,请将命令的输出重定向到文本文件,并从保存的文件而不是 GHCi 运行代码。

【讨论】:

  • 感谢您的回答。不幸的是,我不具备您回答中某些术语的基本知识,这将使我能够理解它,但随着事情的进展,这可能会改变。 :)
  • 尝试将无限字符串写入文件也不是一项富有成效的活动......当然,在进程结束后,您将从头开始保留所有输入,但文件可能大小为几 GB,大多数文本编辑器都会扼杀它。当您知道列表是无限的时,检查它的更好方法是 take 列表的某个前缀(例如 take 10 [0..])。
  • @user2407038 当然,我的建议更多的是关于输出的未知大小以及如何保护自己免受它的影响。如果你写了这样一个文件,你可以安全地检查它的大小并在你意识到你的程序陷入无限循环时丢弃它的内容。还有许多工具可以逐块读取此类文件,而无需将它们全部加载到内存中。
猜你喜欢
  • 2017-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多