注意,这个问题并不是关于“内毒素范畴中的一元”。也不直接涉及
Functor(Monad总是一个Functor,但这个问题主要是关于单台变压器的)
文档在哈斯克尔的SelectT单端变压器上说:
SelectT不是monads范畴中的函子,许多操作不能通过它解除。
MaybeT,RWST等),而有些则没有(ContT,SelectT)?发布于 2020-09-14 23:17:23
对象是单数的范畴,即带有T实例的Type -> Type类型,以及箭头A -> B是它们的底层函子之间的自然转换,通常在Haskell中用forall x. A x -> B x类型的函数表示(尽管严格地说参数性比自然性强)。
这在莫夫包中有一个实现。
这个类别中的初始对象是Identity,因为对于任何单一的T,只有一个自然转换forall x. Identity x -> T x。二是,我认为最后一个对象是Const ()。
MaybeT,RWST等),而有些则没有(ContT,SelectT)?这个类别中的函子需要一个提升的fmap。
fmap'
:: forall m n. (Monad m, Monad n)
=> (forall x. m x -> n x) -> forall x. T m x -> T n x在一般情况下,您不能为ContT和SelectT实现这一功能。我不清楚为什么,但它似乎取决于方差:我们试图实现一个协变函子,但是ContT和SelectT在它们的底层单子中是不变的,例如,m在ContT r m a内的(a -> m r) -> m r中都是正负的。
如果您有一种在monad n中“运行”monad m的一般方法,您不一定可以将其提升到ContT或SelectT中;您只能使用以下更严格的映射操作:
mapSelectT :: (m a -> m a) -> SelectT r m a -> SelectT r m a
mapContT :: (m r -> m r) -> ContT r m a -> ContT r m a其中基础monad和结果类型是固定的。因此,在使用这些变压器的堆栈中,不能总是自由地提升操作。
https://stackoverflow.com/questions/63882053
复制相似问题