Luk*_*vat 5 haskell monad-transformers
我不知道我是如何实现它的,我假设可能没有办法实现它.是否有证据或令人信服的论据无法完成?
有什么ContT特别的?
一般来说,你唯一能从 a 中得到的ContT r m就是类型的值m r。的类型签名Run (ContT r)是
Run (ContT r) = forall n b. Monad n => ContT r n b -> n (StT (ContT r) b)
Run Code Online (Sandbox Code Playgroud)
这相当于
forall n b. ((b -> n r) -> n r) -> n (StT (ContT r) b)
Run Code Online (Sandbox Code Playgroud)
唯一可能的类型StT (ContT r) b是r,但即便如此,也没有可能的已定义类型函数b -> n r传递给ContT。由于liftWith给定的函数需要 type 的值Run (ContT r),因此无法实现。
restoreT使情况变得更糟,因为任何可能从一般中提取的值都ContT r m a无法转回为ContT r m a. 所以你失去了来来去去。
顺便说一下,这也是你无法ContT制作MonadFix. 你不能将任意值a变成任意值r,反之亦然。