21

我怎样才能“杀死”一个耗时太长的纯计算?我试过

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,这可以按预期工作。

4

1 回答 1

23

重点是

return (fact 999999999)

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

如果您强制评估返回值,

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

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

于 2012-04-09T10:08:13.460 回答