[英]'catch' from within MonadIO
我的程序中有一個MonadIO實例,我想從MonadIO中拋出/捕獲異常(來自基本包中的Control.Exception
模塊)。
一個快速的谷歌搜索返回了大量的討論(約會2003年)和復雜的搜索(如實施MonadControlIO,MonadBase等實例),我想知道是否有一個簡單/接受/廣泛使用的解決方案,
如果沒有,那么這個問題會有什么好處? 據我所知,Hackage中有幾個軟件包解決了這個問題,我應該使用哪一個?
(另外,我們也會感謝有關我們為什么沒有MonadIO
catch
推薦讀物)
謝謝,
編輯:所以托馬斯的答案工作正常,但我也想知道還有什么其他選擇,我使用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變換器的作者即將棄用該軟件包。”
但幾周前發布了新的例外包。 它比MonadCatchIO-transformers
具有更好的(更類似於Control.Exception
)API,支持純異常並且它對mtl
友好。
更新:
我在使用monad-control
和exceptions
lifted-base
之間做了一個基准測試,我使用這個基准測試,只是用exceptions
替換monad-peel
。 結果:
| 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 |
偏差大約是幾ns。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.