为什么有ExceptT的MonadMask实例?

Chr*_*tin 6 haskell exception-handling monad-transformers

在上一个问题中,我问道

为什么没有ExceptT的MonadMask实例?

并获得了一些令人信服的答案,包括来自图书馆作者,为什么不存在合法的实例.

截至2月2018年,在例外确实现在有一个实例MonadMaskExceptT.

所以现在我问的是完全相反的问题:为什么上一个问题的答案不正确?

pha*_*dej 2

exceptions库的文档在其文档中有答案:

此方法是在该库的 0.9.0 版本中添加的。以前,此模块中的bracket和 等函数的实现仅finally基于maskuninterruptibleMask函数,不允许某些类变压器拥有MonadMask实例(特别是像 这样的多出口点变压器ExceptT)。如果您是库作者,您现在需要提供此方法的实现......

(注:0.10中改变了类型generalBracket,不要使用0.9)。

  • 该文档不太清楚为什么添加“generalBracket”允许新的守法实例。通过提交历史记录,我找到了一篇[博客文章](https://www.fpcomplete.com/blog/2017/02/monadmask-vs-monadbracket),它给出了更改的动机。 (4认同)