Haskell 哈斯克尔&x2B;无限列表=挂起

Haskell 哈斯克尔&x2B;无限列表=挂起,haskell,Haskell,我正在学习Haskell,阅读了一些参考资料,并且正在研究各种挑战(主要是代码战)。然而,有时我会尝试为一些数学算法生成一个无限列表,然后从中进行选择(比如获取与某些模式匹配的前n个数字) 然而,由于我的语法并不完美,我经常混淆部分,当我想让Haskell定义(惰性)一个无限列表并选择前5个元素(或其他)时,我最终要求它处理完整的无限列表,当我构建测试它时,程序只是挂起 我(曾经)调用了Windows进程管理器,现在发生的事情是,在Visual Studio代码中,当它构建和执行可执行文件时,它

我正在学习Haskell,阅读了一些参考资料,并且正在研究各种挑战(主要是代码战)。然而,有时我会尝试为一些数学算法生成一个无限列表,然后从中进行选择(比如获取与某些模式匹配的前n个数字)

然而,由于我的语法并不完美,我经常混淆部分,当我想让Haskell定义(惰性)一个无限列表并选择前5个元素(或其他)时,我最终要求它处理完整的无限列表,当我构建测试它时,程序只是挂起

我(曾经)调用了Windows进程管理器,现在发生的事情是,在Visual Studio代码中,当它构建和执行可执行文件时,它会以极快的速度增长,吸收所有内存和处理器,直到计算机变得无响应


是否有某种编译器标志可以防止这种情况?

如注释中所述,您可以使用
-M
开关运行可执行文件,该开关允许您指定最大内存大小。(默认值是无限的。)这样,如果您的程序试图使用超过X的内存量,它将因异常而崩溃,而不仅仅是消耗所有可用的RAM

请注意,如果您的程序正在进行大量处理,但没有试图将结果保存在RAM中,那么这将不会有帮助。例如,如果您试图打印出与某个条件匹配的第一个项目,但没有任何项目会与该条件匹配,那么您的程序很可能会永远循环,但实际上不会消耗任何RAM。那样的话,你就得杀了它


您也可以尝试在GHCi中运行代码,只需按下Ctrl+C键即可停止代码,而不会杀死GHCi本身。

这是一般情况,因此编译器无法真正帮助您。你最好注意到它已经挂起,并强制终止它。当你尝试Haskell代码时,你可以在GHCi中运行它,直到你确信它能工作为止。在GHCi中,如果执行似乎挂起,您可以中断执行。使用RTS选项设置最大堆大小可能很有用,例如,
+RTS-M128m-RTS
。有关如何在编译时设置此项的信息,请参阅。不确定如何提供帮助,但请尝试思考函数对列表的实际作用
reverse
自然需要整个列表才能终止,
sort
也是如此
take 5
只需要检查前五个元素。@RobertK,如果这种想法是有效的,那么将Haskell列表理解为“其尾部可能是生成器的单链接列表”是必不可少的。谢谢,我已经开始组合使用ghci,在编译器中设置限制,只是想了解如何处理无限列表。