Tengo una pila de transformador de mónada que incluye un ErrorT
y quiero envolver un transformador ContT r
alrededor de todo. Cuando trato de hacer eso, mis llamadas al throwError
generan errores tipo - aparentemente ContT r
no es automáticamente una instancia de MonadError
. Bien, pensé - Voy a convertirlo en uno:¿Por qué no se puede convertir ContT una instancia de MonadError?
instance MonadError e m => MonadError e (ContT r m) where
throwError = lift . throwError
catchError = liftCatch . catchError
utilizando una definición adecuada de liftCatch
. Pero ahora tengo errores al compilar:
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)'
estoy feliz de usar el pragma UndecidableInstances (estoy bajo la impresión de que no es demasiado preocupante, por ejemplo, véase this question) pero me preguntaba si había una dificultad en la toma de el transformador de continuación en una instancia de MonadError
- Supongo que si estuviera bien, los autores del paquete Control.Monad.Trans
lo habrían hecho ya ... ¿no?
Está bien, pero hace tomar IndecisasInstancias que son demasiado peligrosas y no portátiles para los autores de la biblioteca de transformadores. –