仿函数和endofunctors之间的差异

时间:2012-04-26 23:35:56

标签: haskell functional-programming functor

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

1 个答案:

答案 0 :(得分:55)

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

与内同态与态射相同。

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

有一句名言称“Monads只是endofunctors类别中的幺半群”。幸运的是,其他人已经很好地解释了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是一个更好的endofunctors。

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