I'm curious, is it possible that your new timeout implementation would fix this problem?: doesntWork :: Int -> Int doesntWork x = last $ cycle [x] test :: IO (Maybe Bool) test = timeout 1 $ evaluate $ doesntWork 5 == 5 -- never terminates, even with the timeout