【发布时间】:2012-04-09 09:52:10
【问题描述】:
如何“杀死”耗时过长的纯计算?我试过了
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 替换为像 getLine 这样的“真实” IO 函数,这将按预期工作。
【问题讨论】:
-
有趣的是,如果
fact成为“真正的” IO 操作 (fact 0 = return 1; fact n = (n *) `fmap` (fact $ n - 1)),那么timeout也会按预期工作。 -
@MatveyAksenov:我认为这并不是因为该函数是一个真正的 IO 动作,而是因为它的递归通过
fmap移动到了IOmonad。 -
如果您需要超时任意和潜在的恶意代码,请确保针对非常简单的非分配循环进行测试,例如
let x = x in x和let x () = x () in x ().
标签: haskell timeout purely-functional