我认为ContT的正确类型应该是
newtype ContT m a = ContT {runContT :: forall r. (a -> m r) -> m r}
Run Code Online (Sandbox Code Playgroud)
和其他控制操作员
shift :: Monad m => (forall r. (a -> ContT m r) -> ContT m r) -> ContT m a
reset :: Monad m => ContT m a -> ContT m a
callCC :: ((a -> (forall r. ContT m r)) -> ContT m a) -> ContT m a
Run Code Online (Sandbox Code Playgroud)
不幸的是,我无法进行callCC类型检查,也不知道该怎么做.我设法制作shift并reset打字检查
reset :: Monad m => …Run Code Online (Sandbox Code Playgroud) 问题主要在标题中.似乎mfix可以为任何monadic计算定义,即使它可能有所不同:
mfix :: (a -> m a) -> m a
mfix f = fix (join . liftM f)
Run Code Online (Sandbox Code Playgroud)
这个结构有什么问题?另外,为什么Monad和MonadFixtypeclass分开(即什么类型有一个实例Monad但没有MonadFix?)?