sin*_*nan 5 haskell exception-handling
我的程序中有一个MonadIO实例,我想从MonadIO中抛出/捕获异常(来自Control.Exception基本包中的模块).
一个快速的谷歌搜索返回了很多讨论(约会2003年)和复杂的搜索(如实现MonadControlIO,MonadBase等实例),我想知道是否有一个简单/接受/广泛使用的解决方案,
如果没有,那么这个问题会有什么好处?据我所知,Hackage中有几个软件包可以解决这个问题,我应该使用哪一个?
(顺便说一句,建议我们为什么没有读数catch中MonadIO也将赞赏)
谢谢,
编辑:所以托马斯的答案工作正常,但我也想知道还有什么其他选择,我的主要目的是使用IO例外而不是ErrorT表现,我获得了一些表现Control.Monad.IO.Control(443389蜱与318552蜱之后),有没有更好的选择Control.Monad.IO.Control?
有两种常见的解决方案:monad-control和MonadCatchIO-transformers.而且它们都有一些缺点.例如,monad-control您始终需要MonadBaseControl手动定义,因为无法派生.MonadCatchIO-transformers现在还没有开发,不适用于GHC 7.7,并且根据这个问题 "看起来MonadCatchIO变换器的作者即将弃用该软件包."
但几周前发布了新的例外包.它有更好(更相似Control.Exception)的API MonadCatchIO-transformers,支持纯异常,而且mtl友好.
更新:
我做之间的基准lifted-base使用monad-control和exceptions,我用这个基准,只需更换monad-peel用exceptions.结果:
| 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 |
Run Code Online (Sandbox Code Playgroud)
偏差大约是几ns.