Haskell +无限列表=挂起

时间:2018-06-25 15:20:35

标签: haskell

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

但是,由于我的语法不是很完美,所以我经常混淆各个部分,而我想让Haskell定义(懒惰)一个无限列表并选择前5个元素(或其他任何元素)时,我实际上要求它做点什么带有完整的无限列表,当我对其进行构建测试时,该程序就会挂起。

我设法(一次)调用Windows进程管理器,并且发生的情况是,在Visual Studio Code中,当它生成并执行可执行文件时,它会迅速增长,吸收所有内存和处理器,直到计算机无响应为止。

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

1 个答案:

答案 0 :(得分:1)

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

请注意,如果您的程序正在执行大量处理,但没有尝试实际上将结果保留在RAM中,则这将无济于事。例如,如果您尝试打印出符合条件的第一个项目,但没有项目会符合条件,则很可能您的程序将永远循环,但实际上并没有消耗任何RAM。在这种情况下,您只需要杀死它即可。

您也可以尝试在GHCi中运行代码,您可以在其中刺入Ctrl + C来暂停代码而不会杀死GHCi本身。