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

Why is there no `MonadTransControl` instance for `ContT`

我不知道如何实现它,我假设可能没有办法实现它。是否有证据或令人信服的论据表明它无法做到?

是什么让 ContT 与众不同?

通常,您唯一可以从 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)

相当于

forall n b. ((b -> n r) -> n r) -> n (StT (ContT r) b)

StT (ContT r) b 的唯一可能类型是 r,但即便如此,也没有可能定义的类型 b -> n r 的函数传递给 ContT。并且由于 liftWith 被赋予了一个需要类型 Run (ContT r) 值的函数,因此无法实现。

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

顺便说一句,这也是你无法将 ContT 设为 MonadFix 的原因。您不能将任意 a 变成任意 r,反之亦然。