Почему ContT нельзя сделать экземпляром MonadError?

У меня есть стек преобразователя монад, включающий 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уже бы это сделали... правильно?

5
задан Community 23 May 2017 в 12:20
поделиться