0

我正在创建一个小程序来与一个 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 是否是这样的模块。

因此,即使只是告诉我这行不通,任何对此的帮助都将不胜感激。

4

1 回答 1

4

GHC 线程是协作的。它们只能在执行内存分配时产生或被异步异常终止。这通常可以正常工作,但是恶意的人可以编写一个紧密的循环,在没有分配的情况下运行很长时间。

创建 mueval包是为了处理这样的事情。它是根据提示实现的,但以各种方式增加了许多额外的安全性。

于 2012-08-01T14:43:36.827 回答