J'ai une pile de monades transformées comprenant un ErrorT
et je veux envelopper un transformateur ContT r
autour de tout cela. Lorsque j'essaie de le faire, mes appels à throwError
génèrent des erreurs de type - apparemment ContT r
n'est pas automatiquement une instance de MonadError
. Bon, je pensais - je vais simplement en faire une :
instance MonadError e m => MonadError e (ContT r m) where
throwError = lift . throwError
catchError = liftCatch . catchError
en utilisant une définition adaptée de liftCatch
. Mais maintenant j'obtiens des erreurs lors de la compilation :
src\Language\Types.hs:68:10:
Déclaration d'instance illégale pour `MonadError e (ContT r m)'
(la Condition de Couverture échoue pour l'une des dépendances fonctionnelles ;
Utilisez -XUndecidableInstances pour autoriser cela)
Dans la déclaration d'instance pour `MonadError e (ContT r m)'
Je suis prêt à utiliser la directive UndecidableInstances (j'ai l'impression que ce n'est pas trop inquiétant, voir par exemple cette question), mais je me demandais s'il y avait une difficulté à faire du transformateur de continuation une instance de MonadError
- je suppose que si c'était le cas, les auteurs du package Control.Monad.Trans
l'auraient déjà fait... non ?