【发布时间】:2011-09-13 12:55:11
【问题描述】:
我终于能够追踪到我遇到的一个奇怪的错误(至少对我而言)mask 和 timeout 之间令人惊讶的交互:
import System.Timeout
import Control.Exception
ack :: Int -> Int -> Int
ack m n | m == 0, n >= 0 = n + 1
| m > 0, n == 0 = ack (m - 1) 1
| m > 0, n > 0 = ack (m - 1) (ack m (n - 1))
tryack :: Int -> Int -> IO (Maybe Int)
tryack m n = timeout 100000 {- uS -} $ evaluate $ ack m n
main :: IO ()
main = do
a <- tryack 3 11
print a -- Nothing
b <- mask_ $ tryack 3 11
print b -- Just 16381 after a few seconds
这让我觉得这是一个相当“非组合”的交互,因为这意味着如果一个库在内部使用 timeout,那么在调用链的某个位置外部应用的 mask 可能会导致库出现故障。
那么这是timeout 实现中的(已知)缺陷还是故意的?
【问题讨论】:
标签: exception haskell exception-handling timeout