2016-11-21 49 views
5

我不知道如何实现它,我假设可能没有办法做到这一点。有证据或有说服力的理由说它不能做到吗?为什么没有'Contad的`MonadTransControl`实例

什么使ContT特别?

+2

我认为这个评论[在'ContT'的定义](https://hackage.haskell.org/package/transformers-0.5.2.0/docs/Control-Monad-Trans-Cont.html#t:ContT )是相关的:“'ContT'不是单子类的函数,许多操作不能通过它来解除”。你甚至不需要'm'成为'Monad'就可以拥有'Monad(ContT k r m)'! – Alec

+0

@Alec这绝对会让它变得很奇怪,但它不会将它与'MonadTransControl' –

回答

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) br,但即使这样,还有b -> n r类型的没有可能的定义的函数传递到ContT。并且由于liftWith被赋予了一个需要Run (ContT r)类型值的功能,因此无法实现。

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

顺便说一句,这也是您无法制作ContT a MonadFix的原因。您不能将任意a转换为任意r,反之亦然。

相关问题