我正试图从类别理论的角度了解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上的问题得到了非常有用的答案。
答案 0 :(得分:19)
M ⊗ M
与笛卡尔积有什么关系,因此,射素的域定义为M x M
?
完全正确。更具体地说,我们通过选择 Hask (具有所有Haskell类型作为对象和所有Haskell函数的类别)从 base 中获得由Monoid
类表示的那些类四面体。 (如态射)作为 C ,(,)
(对类型构造函数)作为⊗,而()
(单元类型)作为 I 。 μ和η的签名被翻译为Haskell,然后变为:
μ :: (M, M) -> M
η :: () -> M
通过产生μ,并利用() -> M
函数与M
值一一对应的方式(它们看起来都像{{1} }(对于某些\() -> m
),我们得到了熟悉的m
方法:
Monoid
请注意,分类定义比mappend :: M -> M -> M
mempty :: M
更为笼统。例如,我们可能会继续使用 Hask ,同时将Monoid
和(,)
的对偶替换为()
和Either
,从而得到:>
Void
每种Haskell类型都以这种特定方式是一个单物状(μ是μ :: Either A A -> A
η :: Void -> A
,而η是{{3} }。
另一个示例是以 C 作为Haskell either id id
的类别(它们之间具有自然转换-我将其写为Functor
-作为射态) ,absurd
为⊗和Compose
为 I :
type f ~> g = forall a. f a -> g a
这两个通常写为:
-- 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类别中的一个monoid(这是 Hask 的特定版本,“ monad是内吞因子类别”)。值得一提的是,就像在另一个示例中一样,这不是使类四面体脱离该类别的唯一方法(有关指针,请参见Identity
的最后一段,实际上,其余的可能是相关读物,因为它讨论了单曲面类别的概念。