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

时间:2016-11-21 18:32:07

标签: haskell monad-transformers

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

是什么让TIME IS NOW >>>>>>> 1.0 TIME IS NOW >>>>>>> 2.0 TIME IS NOW >>>>>>> 3.0 TIME IS NOW >>>>>>> 4.0 TIME IS NOW >>>>>>> 5.0 特别?

1 个答案:

答案 0 :(得分:2)

一般来说,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,反之亦然。