从MonadIO中“抓住”

时间:2013-07-08 05:58:49

标签: haskell exception-handling

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

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

如果没有,那么这个问题会有什么好处?据我所知,Hackage中有几个解决这个问题的方法,我应该使用哪一个?

(顺便提一下,我们也会感谢您在catch中没有MonadIO的原因的推荐读物)

谢谢,


编辑:所以托马斯的回答很好,但我也想知道还有什么其他选择,我使用IO例外代替ErrorT的主要目的是表现,我在{{1}之后获得了一些表现。 (443389蜱与318552蜱相比),Control.Monad.IO.Control有更好的替代品吗?

1 个答案:

答案 0 :(得分:7)

有两种常见的解决方案:monad-controlMonadCatchIO-transformers。而且它们都有一些缺点。例如,对于monad-control,您始终需要手动定义MonadBaseControl,因为无法导出。 MonadCatchIO-transformers目前尚未开发,不适用于GHC 7.7,并且根据this issue“看起来像MonadCatchIO变换器的作者即将弃用该软件包。”。

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


更新

我在使用lifted-basemonad-control的{​​{1}}之间进行了基准测试,我使用this基准测试,只需将exceptions替换为monad-peel。结果:

exceptions

偏差大约是几ns。