Tôi có một ngăn biến đổi đơn nguyên bao gồm ErrorT
và tôi muốn bọc một máy biến áp ContT r
xung quanh toàn bộ vật. Khi tôi cố gắng thực hiện điều đó, các cuộc gọi của tôi tới số throwError
tạo ra lỗi loại - dường như ContT r
không tự động là một phiên bản của MonadError
. Tốt thôi, tôi nghĩ - Tôi sẽ chỉ làm cho nó thành một:Tại sao ContT không thể tạo một thể hiện của MonadError?
instance MonadError e m => MonadError e (ContT r m) where
throwError = lift . throwError
catchError = liftCatch . catchError
sử dụng một số định nghĩa phù hợp của liftCatch
. Nhưng bây giờ tôi nhận được lỗi khi biên dịch:
src\Language\Types.hs:68:10:
Illegal instance declaration for `MonadError e (ContT r m)'
(the Coverage Condition fails for one of the functional dependencies;
Use -XUndecidableInstances to permit this)
In the instance declaration for `MonadError e (ContT r m)'
Tôi rất sẵn lòng sử dụng UndecidableInstances pragma (Tôi theo ấn tượng nó không quá đáng lo ngại, ví dụ như thấy this question) nhưng tôi tự hỏi nếu có một khó khăn trong việc đưa ra biến áp tiếp tục thành một thể hiện của MonadError
- Tôi đoán rằng nếu nó là tốt, các tác giả của gói Control.Monad.Trans
sẽ làm điều đó ... đúng không?
Nó là tốt, nhưng không lấy UndecidableInstances quá nguy hiểm và không thể di chuyển cho các tác giả của thư viện máy biến áp. –