仿函数和endofunctors之间的差异

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

一个函子可能从一个类别到另一个类别,一个endofunctor是一个函数,其开始和目标类别是相同的。

同态与态射相同。

现在,monad为什么要成为pipe理者?

有一句名言:“Monad只是内部pipe理员类别中的独angular兽”。 幸运的是,其他人已经在这个答案中解释得相当好。

monad必须成为一个pipe理者的终点的关键在于,像Haskell或µ所称的join ,正如通常在类别理论中所称的那样,是monad定义的一部分。 现在

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

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

如果它的域和共域是相同的(严格来说,如果它的共域是它的域的一个子类别),换句话说,如果它是一个endofunctor,一个仿函数只能与它自己组合。 由于与自身的可组合性是monad定义的一部分,monad是工程师的一个更高端的内容。

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