为什么`ContT`没有`MonadTransControl`实例

Luk*_*vat 5 haskell monad-transformers

我不知道我是如何实现它的,我假设可能没有办法实现它.是否有证据或令人信服的论据无法完成?

有什么ContT特别的?

Zem*_*yla 2

一般来说,你唯一能从 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) br,但即便如此,也没有可能的已定义类型函数b -> n r传递给ContT。由于liftWith给定的函数需要 type 的值Run (ContT r),因此无法实现。

restoreT使情况变得更糟,因为任何可能从一般中提取的值都ContT r m a无法转回为ContT r m a. 所以你失去了来来去去。

顺便说一下,这也是你无法ContT制作MonadFix. 你不能将任意值a变成任意值r,反之亦然。