我想用Haskell评估随机计算,并使用Control.Monad.Random库超时.以下工作正常:
ghci> import System.Timeout
ghci> import Control.Monad.Random
ghci> timeout 1000 . evalRandIO $ getRandomR (True, False)
Just True
Run Code Online (Sandbox Code Playgroud)
但是,如果我们有一个Rand StdGen a永不终止的类型计算(即评估到底部),这种方法似乎不起作用.例如:
ghci> let f = f :: Rand StdGen Bool
ghci> timeout 1000 $ evalRandIO f
Just
Run Code Online (Sandbox Code Playgroud)
在这里GHCI打印"Just",然后无限期地挂起试图评估f.能否了解Haskell运行时的人比我更能解释为什么会这样,以及如何解决它?我的猜测是表达式evalRandIO f被评估为WHNF,因此timeout 10认为计算将终止,但我真的不知道.