【发布时间】:2018-06-25 15:20:35
【问题描述】:
我正在学习 Haskell,阅读了一些参考资料,并且正在应对各种挑战(主要是代码战)。但是有时我会尝试为某些数学算法生成一个无限列表,然后从中进行选择(例如获取与某些模式匹配的前 n 个数字)。
但是,由于我的语法并不完美,我经常混淆部分,虽然我想要求 Haskell 定义(惰性)一个无限列表并选择前 5 个元素(或其他),但我最终实际上要求它做某事使用完整的无限列表,当我构建测试它时,程序只是挂起。
我设法(一次)调用了 Windows 进程管理器,发生的情况是,在 Visual Studio Code 中,当它构建和执行可执行文件时,它会以极快的速度增长,吸收所有内存和处理器,直到计算机变得无响应。
是否有某种编译器标志可以防止这种情况发生?
【问题讨论】:
-
一般是impossible to determine if a program will ever terminate,所以编译器无法真正帮助你。你最好的办法是注意到它已经挂断并强行终止它。
-
当您试验 Haskell 代码时,您可以在 GHCi 中运行它,直到您确信它可以工作为止。在 GHCi 中,如果执行似乎挂起,您可以中断。 Here's how to do it on Windows.
-
使用 RTS 选项设置最大堆大小可能很有用,例如,
+RTS -M128m -RTS。有关如何在编译时进行设置的信息,请参阅 the manual。 -
不确定如何提供帮助,但请尝试想想您的函数对列表的实际作用。
reverse自然需要整个列表才能终止,sort也是如此。take 5只需要检查前五个元素。 -
@RobertK,如果这样的想法要产生成效,将 Haskell 列表理解为“尾部可能是生成器的单链表”是必不可少的。
标签: haskell