Ich habe einen Monad Transformator Stack einschließlich einer ErrorT
und ich möchte einen ContT r
Transformator um die ganze Sache wickeln. Wenn ich das versuche, generieren meine Aufrufe an throwError
Typfehler - anscheinend ContT r
ist nicht automatisch eine Instanz von MonadError
. Gut, dachte ich - ich werde es einfach machen in einem:Warum kann ContT nicht zu einer Instanz von MonadError gemacht werden?
instance MonadError e m => MonadError e (ContT r m) where
throwError = lift . throwError
catchError = liftCatch . catchError
eine geeignete Definition von liftCatch
verwenden. Aber ich jetzt Fehlermeldungen erhalte beim Kompilieren:
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)'
Ich bin glücklich, die UndecidableInstances Pragma zu verwenden (ich habe den Eindruck, es ist nicht zu Besorgnis erregend, siehe zB this question), aber ich fragte mich, ob es eine Schwierigkeit war, bei der Herstellung von die Fortsetzung Transformator in eine Instanz von MonadError
- Ich denke, wenn es in Ordnung wäre, hätten die Autoren der Control.Monad.Trans
Paket schon getan ... oder?
Es ist in Ordnung, aber tut Nehmen Sie UndecidableInstances, was für die Autoren der Transformatorenbibliothek zu gefährlich und nicht portabel ist. –