2013-07-08 29 views
5

Tôi có một cá thể MonadIO trong chương trình của mình và tôi muốn ném/bắt ngoại lệ (từ mô-đun Control.Exception trong gói cơ sở) từ khi sử dụng MonadIO đó.'bắt' từ bên trong MonadIO

Tìm kiếm nhanh chóng của Google trả lại rất nhiều cuộc thảo luận (hẹn hò 2003) và linh hồn phức tạp (như triển khai MonadControlIO, MonadBase v.v.), tôi đã tự hỏi liệu có một giải pháp dễ sử dụng/được chấp nhận/sử dụng rộng rãi cho điều đó không,

Nếu không có, giải pháp tốt nhất cho vấn đề này là gì? Theo như tôi có thể thấy có một số gói trong Hackage giải quyết vấn đề này, cái nào tôi nên sử dụng?

Cảm ơn,


EDIT (như là một sang một bên, bài đọc về việc tại sao chúng ta không có catch trong MonadIO cũng sẽ được đánh giá đề nghị): Vì vậy, câu trả lời của Thomas hoạt động tốt nhưng tôi cũng tự hỏi lựa chọn thay thế khác là gì, mục đích chính của tôi là sử dụng IO ngoại lệ thay vì ErrorT là hiệu suất và tôi đạt được hiệu suất sau Control.Monad.IO.Control (443389 bọ ve và 318552 bọ), có bất kỳ giải pháp thay thế nào tốt hơn cho Control.Monad.IO.Control không?

+1

Một giải pháp là chỉ cần thêm một ràng buộc thêm lớp: [MonadCatchIO] (http://hackage.haskell.org/packages/archive/MonadCatchIO-transformers/0.3.0.0/doc/html/Control-Monad-CatchIO. html). Một giải pháp khác là sử dụng kiểm soát đơn nguyên. –

+0

@ ThomasM.DuBuisson, làm cách nào tôi có thể triển khai 'catch' trong MonadCatchIO cho ngăn xếp đơn nguyên của mình? – sinan

+0

@sinan: Bất kỳ mã mẫu nào thực sự sẽ giúp – Ankur

Trả lời

7

Có hai giải pháp phổ biến: monad-controlMonadCatchIO-transformers. Và cả hai đều có một nhược điểm. Ví dụ: monad-control bạn luôn cần xác định MonadBaseControl theo cách thủ công vì không thể bắt nguồn. MonadCatchIO-transformers hiện không được phát triển, không hoạt động với GHC 7.7 và theo số this issue "Có vẻ như tác giả của MonadCatchIO-máy biến áp sắp ngừng sử dụng gói.".

Nhưng một vài tuần trước, gói mới exceptions đã được phát hành. Nó có API tốt hơn (tương tự như Control.Exception) hơn MonadCatchIO-transformers, hỗ trợ ngoại lệ thuần túy và nó là thân thiện với mtl.


Cập nhật:

tôi đã làm một chuẩn mực giữa lifted-base sử dụng monad-controlexceptions, tôi sử dụng this điểm chuẩn và chỉ cần thay thế monad-peel với exceptions. Kết quả:

| 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 | 

Độ lệch khoảng một vài ns.

Các vấn đề liên quan