仿函数和endofunctors之间的差异

Jon*_*lap 42 haskell functional-programming functor

有人可以简单地解释两者之间的区别吗?我并没有完全理解monad是endofunctor而不仅仅是functor的部分.

Dan*_*her 55

仿函数可以从一个类别转到另一个类别,endofunctor是一个仿函数,其起点和目标类别相同.

与内同态与态射相同.

现在,为什么monad必须是endofunctors?

有一句名言称"Monads只是endofunctors类别中的幺半群".幸运的是,其他人已经在这个答案中解释得相当好.

monad必须是一个endofunctor的关键点在于join,它在Haskell中被称为,或者µ,因为它通常在类别理论中被称为,它是monad定义的一部分.现在

Prelude Control.Monad> :t join
join :: Monad m => m (m a) -> m a
Run Code Online (Sandbox Code Playgroud)

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

如果一个仿函数的域和codomain是相同的[严格来说,如果它的codomain是其域的子类别],换句话说,如果它是一个endofunctor,那么它只能由它自己组成.由于与自身的可组合性是monad定义的一部分,monad是一个更好的endofunctors.

¹一个定义,一个可替代使用限定单子(>>=)bind和具有join作为派生属性.

  • Haskell中是否有任何不是endofunctor的仿函数?(难道他们都不把Hask映射到Hask吗?) (5认同)
  • 对,所有Haskell仿函数都是endo. (5认同)
  • 非endofunctors可以在http://hackage.haskell.org/packages/archive/categories/1.0/doc/html/Control-Categorical-Functor.html等软件包中找到. (3认同)
  • @JonathanDunlap好的,相应地更新答案(虽然需要一段时间,但我很慢).幺半群是一种不同类型的野兽,它只是一些仿函数(例如monad)也是幺半群(在某些类别中).偶然的. (2认同)