簡體   English   中英

從MonadIO中“抓住”

[英]'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-controlMonadCatchIO-transformers 而且它們都有一些缺點。 例如,使用monad-control您始終需要手動定義MonadBaseControl ,因為無法派生它。 MonadCatchIO-transformers目前尚未開發,不適用於GHC 7.7,並且根據這個問題 “看起來MonadCatchIO變換器的作者即將棄用該軟件包。”

但幾周前發布了新的例外包。 它比MonadCatchIO-transformers具有更好的(更類似於Control.Exception )API,支持純異常並且它對mtl友好。


更新:

我在使用monad-controlexceptions 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM