documentation for Control.Exception
描述哪些操作可以抛出异步异常,即使在mask
ed块中也是如此,它说:“以下操作保证不可中断”
如果MVar肯定是满的,则选择MV,如果是,则反过来放入MVar MVar肯定是空的
在什么情况下编译器的观点是MVar
“肯定是满的还是空的?这是否足够好定义,以便能够推断我的代码是否会在每次MVar
操作时都不会处理异步异常而中断?
答案 0 :(得分:4)
编译器没有做出这种保证,这就是他们这么说的原因。
具体而言,如果MVar
已满,则takeMVar
不会阻止,并且不会被中断。类似地,对于空MVar
和putMVar
,由于它没有阻塞,因此无法中断。
使用短语是因为如果MVar
未满,说因为它有时是满的,有时不是,那么保证不再是真的。