不了解Monoid定义中的态素表示法

时间:2019-05-18 15:41:44

标签: haskell category-theory monoids

我正试图从类别理论的角度了解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上的问题得到了非常有用的答案。

1 个答案:

答案 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-作为射态) ,absurdCompose 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的最后一段,实际上,其余的可能是相关读物,因为它讨论了单曲面类别的概念。