我正在创建一个小程序来与一个 irc 机器人一起使用,它应该接受一个字符串,然后评估该字符串。为此,我使用了提示包,它非常适合我的需要。我现在遇到的问题是,我希望能够防止计算需要很长时间才能计算出来的表达式,例如 2^1000000000。
我尝试使用这样的 System.Timeout 包:
import Data.Maybe
import Language.Haskell.Interpreter
import System.Timeout
import System.Environment (getArgs)
main :: IO()
main = do
r <- timeout 500000 $ runInterpreter $ hEval arg
case r of
Nothing -> putStrLn "Timed out!"
Just x ->
case x of
Left err -> putStrLn (show err)
Right a -> putStrLn a
hEval e = do
setImportsQ [("Prelude", Nothing),("Data.List",Nothing)]
a <- eval e
return $ take 200 a
但它不起作用,除非我投入如此短的时间以至于无法评估任何东西,否则超时不会触发。我在 Timeout 包的页面上读到,它可能与某些模块有问题,必须让主题完成,但我的理解还不足以知道 Hint 是否是这样的模块。
因此,即使只是告诉我这行不通,任何对此的帮助都将不胜感激。