【发布时间】:2012-05-07 17:51:15
【问题描述】:
有人可以简单地解释一下两者之间的区别吗?我不完全理解单子是内函子而不是函子的部分。
【问题讨论】:
标签: haskell functional-programming functor
有人可以简单地解释一下两者之间的区别吗?我不完全理解单子是内函子而不是函子的部分。
【问题讨论】:
标签: haskell functional-programming functor
一个函子可以从一个类别转到另一个类别,内函子是一个起点和目标类别相同的函子。
与内同态与态射相同。
现在,为什么单子必须是内函子?
有一句名言:“Monads 只是内函子范畴中的幺半群”。幸运的是,其他人已经很好地解释了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 更何况是内函子。
¹ 一种定义,可以使用(>>=) 或bind 定义一个monad,并将join 作为派生属性。
【讨论】: