我怎么才能“杀死”一个耗时太长的纯计算呢?我试过了
import System.Timeout
fact 0 = 1
fact n = n * (fact $ n - 1)
main = do maybeNum <- timeout (10 ^ 7) $ (return . fact) 99999999
print maybeNum
然而,这不起作用。用像getLine
这样的“真实”IO函数替换(return . fact) 99999999
,它就可以正常工作了。
发布于 2012-04-09 18:08:13
重点是
return (fact 999999999)
立即返回,并且不触发超时。它返回一个thunk,稍后将对其进行计算。
如果强制计算返回值,
main = do maybeNum <- timeout (10 ^ 7) $ return $! fact 99999999
print maybeNum
它应该触发超时(如果您提供了一个足够大的堆栈,以便在堆栈溢出之前发生超时)。
https://stackoverflow.com/questions/10071560
复制相似问题