6

我的程序中有一个 MonadIO 实例,我想Control.Exception从该 MonadIO 中抛出/捕获异常(来自基本包中的模块)。

快速的谷歌搜索返回了很多讨论(约会 2003)和复杂的解决方案(如实现 MonadControlIO、MonadBase 等实例),我想知道是否有一个简单/接受/广泛使用的解决方案,

如果没有,这个问题的一个很好的解决方案是什么?据我所知,Hackage 中有几个包解决了这个问题,我应该使用哪一个?

(顺便说一句,关于我们为什么没有catchin的推荐读物MonadIO也将不胜感激)

谢谢,


编辑:所以托马斯的回答很好,但我也想知道还有什么其他选择,我使用IO异常而不是ErrorT性能的主要目的,并且我在(443389 滴答声与 318552 滴答声)之后获得了一些性能Control.Monad.IO.Control,有没有更好的选择Control.Monad.IO.Control

4

1 回答 1

10

有两种常见的解决方案:monad-controlMonadCatchIO-transformers。他们都有一系列的缺点。例如,monad-control您总是需要MonadBaseControl手动定义,因为它无法派生。MonadCatchIO-transformers现在不在开发中,不适用于 GHC 7.7,并且根据这个问题“看起来 MonadCatchIO-transformers 的作者即将弃用该包。”。

但几周前,新的例外包发布了。它具有比 更好(更类似于Control.Exception)的 API MonadCatchIO-transformers,支持纯异常并且很mtl友好。


更新:

我在lifted-base使用monad-controland之间做了一个基准测试exceptions,我使用这个基准测试并只是替换monad-peelexceptions. 结果:

| benchmark | exceptions | lifted-base |
+-----------+------------+-------------+
| bracket   | 148.38 ns  | 182.28 ns   |
| bracket_  | 47.30 ns   | 112.37 ns   |
| catch     | 62.85 ns   | 156.30 ns   |
| try       | 54.70 ns   | 77.84 ns    |

偏差约为几纳秒。

于 2013-07-08T07:20:51.393 回答