我的程序中有一个MonadIO实例,我想从MonadIO中抛出/捕获异常(来自基础包中的Control.Exception
模块)。
快速谷歌搜索返回了大量讨论(约会2003年)和复杂的搜索(如实施MonadControlIO,MonadBase等实例),我想知道是否有一个简单/接受/广泛使用的解决方案,
如果没有,那么这个问题会有什么好处?据我所知,Hackage中有几个解决这个问题的方法,我应该使用哪一个?
(顺便提一下,我们也会感谢您在catch
中没有MonadIO
的原因的推荐读物)
谢谢,
IO
例外代替ErrorT
的主要目的是表现,我在{{1}之后获得了一些表现。 (443389蜱与318552蜱相比),Control.Monad.IO.Control
有更好的替代品吗?
答案 0 :(得分:7)
有两种常见的解决方案:monad-control
和MonadCatchIO-transformers
。而且它们都有一些缺点。例如,对于monad-control
,您始终需要手动定义MonadBaseControl
,因为无法导出。 MonadCatchIO-transformers
目前尚未开发,不适用于GHC 7.7,并且根据this issue“看起来像MonadCatchIO变换器的作者即将弃用该软件包。”。
但几周前发布了新的exceptions软件包。它比Control.Exception
更好(更类似于MonadCatchIO-transformers
)API,支持纯异常,并且mtl
友好。
更新
我在使用lifted-base
和monad-control
的{{1}}之间进行了基准测试,我使用this基准测试,只需将exceptions
替换为monad-peel
。结果:
exceptions
偏差大约是几ns。