Почему не может быть экземпляр MonadFix для продолжения монады?

Как мы можем доказать, что продолжение монады не имеет действительного экземпляра MonadFix?

Ответы

Ответ 1

Ну, на самом деле, это не значит, что не может быть экземпляр MonadFix, просто тип библиотеки слишком ограничен. Если вы определяете ContT по всем возможным r s, то становится возможным не только MonadFix, но все экземпляры до Monad не требуют ничего от базового функтора:

newtype ContT m a = ContT { runContT :: forall r. (a -> m r) -> m r }
instance Functor (ContT m) where
  fmap f (ContT k) = ContT (\kb -> k (kb . f))
instance Monad (ContT m) where
  return a = ContT ($a)
  join (ContT kk) = ContT (\ka -> kk (\(ContT k) -> k ka))
instance MonadFix m => MonadFix (ContT m) where
  mfix f = ContT (\ka -> mfixing (\a -> runContT (f a) ka<&>(,a)))
    where mfixing f = fst <$> mfix (\ ~(_,a) -> f a )