为什么没有 `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
,反之亦然。
我不知道如何实现它,我假设可能没有办法实现它。是否有证据或令人信服的论据表明它无法做到?
是什么让 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
,反之亦然。