首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在monads类别中,函子是什么?

在monads类别中,函子是什么?
EN

Stack Overflow用户
提问于 2020-09-14 09:55:31
回答 1查看 227关注 0票数 7

注意,这个问题并不是关于“内毒素范畴中的一元”。也不直接涉及Functor( Monad总是一个Functor,但这个问题主要是关于单台变压器的)

文档在哈斯克尔的SelectT单端变压器上说:

SelectT不是monads范畴中的函子,许多操作不能通过它解除。

  1. 单子的种类是什么?那个类别中的箭头是什么?
  2. 为什么有些单模变压器函子属于单模(MaybeTRWST等),而有些则没有(ContTSelectT)?
  3. 从编程的角度来看,成为monads类的函子有什么好处呢?作为图书馆的消费者,我为什么要在意呢?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-09-14 23:17:23

  1. 单子的种类是什么?那个类别中的箭头是什么?

对象是单数的范畴,即带有T实例的Type -> Type类型,以及箭头A -> B是它们的底层函子之间的自然转换,通常在Haskell中用forall x. A x -> B x类型的函数表示(尽管严格地说参数性比自然性强)。

这在莫夫包中有一个实现。

这个类别中的初始对象是Identity,因为对于任何单一的T,只有一个自然转换forall x. Identity x -> T x。二是,我认为最后一个对象是Const ()

  1. 为什么有些单模变压器函子属于单模(MaybeTRWST等),而有些则没有(ContTSelectT)?

这个类别中的函子需要一个提升的fmap

代码语言:javascript
复制
fmap'
  :: forall m n. (Monad m, Monad n)
  => (forall x. m x -> n x) -> forall x. T m x -> T n x

在一般情况下,您不能为ContTSelectT实现这一功能。我不清楚为什么,但它似乎取决于方差:我们试图实现一个协变函子,但是ContTSelectT在它们的底层单子中是不变的,例如,mContT r m a内的(a -> m r) -> m r中都是正负的。

  1. 从编程的角度来看,成为monads类的函子有什么好处呢?作为图书馆的消费者,我为什么要在意呢?

如果您有一种在monad n中“运行”monad m的一般方法,您不一定可以将其提升到ContTSelectT中;您只能使用以下更严格的映射操作:

代码语言:javascript
复制
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和结果类型是固定的。因此,在使用这些变压器的堆栈中,不能总是自由地提升操作。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63882053

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档