定时纯函数

时间:2012-04-09 09:52:10

标签: haskell timeout purely-functional

我怎样才能杀死"一个纯粹的计算,这花了太长时间?我试过了

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替换为&#34; real&#34; IO函数如getLine,这可以按预期工作。

1 个答案:

答案 0 :(得分:21)

重点是

return (fact 999999999)

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

如果强制评估返回值,

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

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