在Haskell中是否有任何方法(如果需要在Linux和Windows上运行的代码使用GHC来执行有界计算)?也就是说,"如果可行的话,计算此函数的结果,但如果尝试使用了超过X个CPU周期,Y堆栈空间或Z堆空间,但仍未完成,请停止并返回指示是不是可以完成计算"?
System.Timeout.timeout :: Int -> IO a -> IO (Maybe a)
Run Code Online (Sandbox Code Playgroud)
这是一个你可以尝试的hackish解决方案:用你的计算产生forkIO,让父线程(或者有权访问分叉线程的监视线程ThreadId)周期性地轮询你想要的任何数量,并向计算线程抛出异步异常必要时(有趣的是,这正是如何timeout运作的.)
接下来的问题是,是否有办法在Haskell中找出当前堆的大小.您可以通过生成shell命令或以其他方式查询操作系统来查找总内存消耗和周期(我不知道如何在Windows上执行此操作.)
它不是一个完美的解决方案,但它是一个简单的解决方案,你可以在几分钟内实现和测试.