Мне наконец удалось отследить странную ошибку, с которой я столкнулся, вплоть до (по крайней мере, для меня) удивительного взаимодействия между 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
или это умышленно?