【问题标题】:Differences between functors and endofunctors函子和内函子之间的区别
【发布时间】:2012-05-07 17:51:15
【问题描述】:

有人可以简单地解释一下两者之间的区别吗?我不完全理解单子是内函子而不是函子的部分。

【问题讨论】:

    标签: haskell functional-programming functor


    【解决方案1】:

    一个函子可以从一个类别转到另一个类别,内函子是一个起点和目标类别相同的函子。

    与内同态与态射相同。

    现在,为什么单子必须是内函子?

    有一句名言:“Monads 只是内函子范畴中的幺半群”。幸运的是,其他人已经很好地解释了in this answer

    monad 必须是 endofunctor 的关键点在于,join(在 Haskell 中称为)或µ(通常在范畴论中称为)是 monad 定义¹的一部分.现在

    Prelude Control.Monad> :t join
    join :: Monad m => m (m a) -> m a
    

    所以将仿函数 m 应用于对象(在 Hask 中,Haskell 类型作为对象和函数作为态射的范畴)的结果必须是 m 可以再次应用于的对象。这意味着它必须属于函子m 的域类别。

    只有当它的域和codomain 相同时[严格来说,如果它的codomain 是它的域的子类],一个函子才能与它自己组合,换句话说,如果它是一个endofunctor。由于与自身的可组合性是 monad 定义的一部分,因此 monad 更何况是内函子。

    ¹ 一种定义,可以使用(>>=)bind 定义一个monad,并将join 作为派生属性。

    【讨论】:

    • Haskell 中是否有任何不是内函子的函子? (他们不都将 Hask 映射到 Hask 吗?)
    • 对,所有的 Haskell 函子都是 endo。
    • @JonathanDunlap 我突然想到,你是不是打错字了,实际上是指monads,而不是monoids?如,“Monads 是 Endofunctors 类别中的幺半群”,或者说是什么意思?
    • @JonathanDunlap 好的,将相应地更新答案(虽然需要一段时间,但我很慢)。 Monoids 是一种不同的野兽,只是一些函子(例如,monads)也是 monoids(在某些类别中)。有点偶然。
    猜你喜欢
    • 2014-06-08
    • 1970-01-01
    • 2012-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-11
    • 1970-01-01
    • 2017-10-07
    相关资源
    最近更新 更多