8

Haskell 中是否有任何方法(如果重要,使用 GHC,对于需要在 Linux 和 Windows 上运行的代码)来执行有界计算?也就是说,“如果可行,则计算此函数的结果,但如果尝试使用了超过 X 个 CPU 周期、Y 个堆栈空间或 Z 个堆空间,并且仍然没有完成,则停止并返回一个指示它无法完成计算”?

4

3 回答 3

8
System.Timeout.timeout :: Int -> IO a -> IO (Maybe a)

http://lambda.haskell.org/hp-tmp/docs/2011.2.0.0/ghc-doc/libraries/base-4.3.1.0/System-Timeout.html#v:timeout

于 2012-05-27T07:06:36.710 回答
6

这是您可以尝试的一个骇人听闻的解决方案:使用 生成您的计算forkIO,并让父线程(或可以访问分叉线程的监视线程ThreadId)定期轮询您想要的任何数量,并向计算线程抛出一个异步异常根据需要(有趣的是,这正是它的timeout工作原理。)

下一个问题是是否有办法从 Haskell 中找出当前堆有多大。您可以通过生成 shell 命令或以其他方式查询操作系统来找出总内存消耗和周期(我不知道如何在 Windows 上做到这一点。)

这不是一个完美的解决方案,但它是一个简单的解决方案,您可以在几分钟内实施和测试。

于 2012-05-27T09:30:57.787 回答
6

在每个进程级别上,您可以使用GHC 的 RTS 选项来控制最大堆栈和堆大小。

于 2012-05-27T14:46:07.923 回答