我试图从范畴论的角度理解
Monoid
是什么,但我对用来描述它的符号有点困惑。这是维基百科:
在范畴论中,幺半群范畴(C,⊗,I)中的幺半群(或幺半群对象)(M,μ,η)是一个带有两个态射的对象 M
μ: M ⊗ M → M 称为乘法,
η: I → M 称为单位
我的困惑在于态射符号。为什么二元运算
⊗
是态射表示法的一部分?我对态射的理解是,它是一种可以从一种类型映射到另一种类型(域到共域)的函数,例如M → M
。为什么操作 ⊗
是定义中域的一部分?第二个困惑是关于I
。为什么 I
是一个域? I
中根本不存在 Monoid
对象。它只是物体的一个中性元素M
。
我知道
Monoid
是一个具有一个对象、恒等态射和在此对象上定义的二元运算的范畴,但这种符号让我觉得我不明白某些东西。
M ⊗ M
是否与笛卡尔积有某种关系,因此态射的域被定义为M x M
?
编辑:我在Mathematics Stack Exchange上得到了对我的问题非常有用的答案。
与笛卡尔积有什么关系吗,所以态射的域定义为M ⊗ M
?M x M
完全正确。更具体地说,我们通过选择
Hask(所有 Haskell 类型作为对象,所有 Haskell 函数作为态射的类别)作为 C,
Monoid
(对类型构造函数)为 ⊗,(,)
(单位类型)为 I。 μ和η的签名,翻译成Haskell,则变成:
()
通过柯里化 μ,并利用
μ :: (M, M) -> M
η :: () -> M
函数与 () -> M
值一一对应(对于某些
M
,它们看起来都像 \() -> m
),我们得到了熟悉的 m
方法:Monoid
请注意,分类定义远比 mappend :: M -> M -> M
mempty :: M
更笼统。例如,我们可以继续在Hask
中工作,同时用它们的对偶
Monoid
和 (,)
替换 ()
和 Either
,从而得到:Void
每个 Haskell 类型都是幺半群 以这种特殊的方式(μ
是 μ :: Either A A -> A
η :: Void -> A
,η 是
either id id
)。
另一个例子是将 C 视为 Haskell absurd
的范畴(它们之间有自然变换——我将其写为 Functor
——作为态射),
type f ~> g = forall a. f a -> g a
为 ⊗,和
Compose
为 I:
Identity
这两个通常写为:
-- Note the arrows here are ~>, and not ->
μ :: Compose M M ~> M
η :: Identity ~> M
换句话说,
-- "Inlining" the definitions of Compose, Identity, and ~>
join :: M (M a) -> M a
return :: a -> M a
是
Monad
s类别中的幺半群(这是“单子是endofunctors类别中的幺半群”的
Hask特定版本)。值得一提的是,正如在另一个例子中一样,这并不是将幺半群从该类别中分离出来的唯一方法(请参阅
这个答案的最后一段以获取指针 - 事实上,其余部分可能是相关的)阅读,因为它讨论了幺半群范畴的概念)。