Haskell:从Hint包中运行eval时需要Timeout

时间:2012-08-01 14:02:59

标签: haskell timeout eval hint

我正在创建一个与irc bot一起使用的小程序,该程序应该接受一个字符串,然后评估字符串。为此,我使用的是the hint package,它可以很好地满足我的需求。我现在遇到的问题是,我希望能够阻止对需要变化很长的表达式进行评估,例如2 ^ 10亿。

我尝试使用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是否是这样一个模块。

所以对此的任何帮助都会受到赞赏,即使它只是告诉我这不会起作用。

1 个答案:

答案 0 :(得分:4)

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

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