46

有人可以简单地解释两者之间的区别吗?我不完全理解单子是内函子而不是函子的部分。

4

1 回答 1

62

一个函子可以从一个类别转到另一个类别,内函子是一个起点和目标类别相同的函子。

与内同态与态射相同。

现在,为什么单子必须是内函子?

有一句名言“Monads 只是内函子范畴中的幺半群”。幸运的是,其他人已经在这个答案中很好地解释了这一点。

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 更何况是内函子。

¹ 一种定义,可以选择使用(>>=)orbind和 havejoin作为派生属性来定义 monad。

于 2012-04-26T23:37:22.677 回答