Tôi biết nó có thể thay đổi kiểu bọc, do đó bạn có thể cóCó thể thay đổi loại đơn nguyên theo một trình tự đơn sắc không?
f :: (a -> m b)
g :: (b -> m c)
f >>= g :: (a -> m c)
nhưng là nó có thể thay đổi m
? Nếu m
là MonadError
và được triển khai cả bởi Either ErrorA
và Either ErrorB
, tôi có thể xích chúng bằng cách nào đó không? Rõ ràng là tôi không thể xích chúng trực tiếp, bởi vì đây sẽ là loại Left
? Tuy nhiên, tôi đang ở trong một tình huống mà tôi kết thúc gọi show
trong cả hai trường hợp, nhưng tôi đã không tìm thấy một giải pháp tốt hơn so với
case mightFail1 of
Left e -> show e
Right v -> either show doStuff mightFail2
mà thất bại trong việc sử dụng đúng các hành vi monadic dừng lại ở lỗi đầu tiên mà không tôi phải kiểm tra một cách rõ ràng.
Như câu trả lời của J. Abrahamson cho biết, đây là một sự chuyển đổi tự nhiên giữa hai monads, còn được gọi là ** monph morphism **. Có một vài gói để hỗ trợ khái niệm này và các khái niệm tương tự; Tekmo có [một bài đăng blog trên gói 'mmorph' của anh ấy] (http://www.haskellforall.com/2013/03/mmorph-100-monad-morphisms.html) mà bạn có thể thử đọc. Nói chung, tuy nhiên, tôi tin rằng một hình thái giữa hai monads có thể cần phải có một số truy cập vào "ruột" của mỗi monad để dịch giữa chúng. –