У меня есть стек преобразователя монад, включающий ErrorT
, и я хочу обернуть ContT r
. ] трансформатор вокруг всего этого. Когда я пытаюсь это сделать, мои вызовы throwError
генерируют ошибки типа — по-видимому, ContT r
не является автоматически экземпляром MonadError
. Хорошо, подумал я, я просто сделаю это одним:
instance MonadError e m => MonadError e (ContT r m) where
throwError = lift . throwError
catchError = liftCatch . catchError
используя подходящее определение liftCatch
. Но теперь я получаю ошибки при компиляции:
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)'
Я рад использовать прагму UndecidableInstances (у меня сложилось впечатление, что это не слишком тревожно, например, см. этот вопрос), но мне было интересно, есть ли сложность в превращении преобразователя продолжения в экземпляр MonadError
- думаю, если бы это было нормально, то авторы пакета Control.Monad.Trans
уже бы это сделали... правильно?