嗯,其实不是不能有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 )
Run Code Online (Sandbox Code Playgroud)