Ho una pila di trasformatori monad incluso uno ErrorT
e voglio avvolgere un trasformatore ContT r
attorno al tutto. Quando provo a farlo, le mie chiamate a throwError
generano errori di tipo - apparentemente ContT r
non è automaticamente un'istanza di MonadError
. Bene, ho pensato - mi rifarò in uno:Perché non può essere eseguita un'istanza di MonadError in ContT?
instance MonadError e m => MonadError e (ContT r m) where
throwError = lift . throwError
catchError = liftCatch . catchError
con qualche definizione adeguata di liftCatch
. Ma ora ho errori durante la compilazione:
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)'
Sono felice di usare la direttiva UndecidableInstances (io sono sotto l'impressione che non sia troppo preoccupante, ad esempio, vedi this question), ma mi chiedevo se ci fosse una difficoltà nel fare il trasformatore di continuazione in un'istanza di MonadError
- Immagino che se fosse andato bene, gli autori del pacchetto Control.Monad.Trans
lo avrebbero già fatto ... giusto?
E va bene, ma fa prendere UndecidableInstances che è troppo pericoloso e non portabile per gli autori della libreria dei trasformatori. –