使纯函数超时



如何"杀死"花费太长时间的纯计算?我试过了

import System.Timeout
fact 0 = 1
fact n = n * (fact $ n - 1)
main = do maybeNum <- timeout (10 ^ 7) $ (return . fact) 99999999
          print maybeNum

但是,这不起作用。将(return . fact) 99999999替换为"真正的"IO 函数,如 getLine,这将按预期工作。

关键是

return (fact 999999999)

立即返回,并且不触发超时。它返回一个稍后将评估的 thunk。

如果强制计算返回值,

main = do maybeNum <- timeout (10 ^ 7) $ return $! fact 99999999
          print maybeNum

它应该触发超时(如果您提供的堆栈足够大,以便在堆栈溢出之前发生超时)。

相关内容

  • 没有找到相关文章

最新更新