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
作为派生属性.