有人可以简单地解释两者之间的区别吗?我并没有完全理解monad是endofunctor而不仅仅是functor的部分。
答案 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
作为派生属性。