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

Bog*_*nko 10 haskell category-theory monoids

我试图Monoid从类别理论的角度理解什么,但是我与用来描述它的符号有些混淆。这是维基百科:

在范畴论中,在一个单曲面范畴(C,α,I)中的一个单曲面(或单曲面对象)(M,?,I)是一个具有两个同态的对象M

?:M?M?M称为乘法

?: 一世 ?M称为单位

我对态素表示法感到困惑。为什么二进制运算?是射态符号的一部分?我对态射的理解是,它是一种可以从一种类型映射到另一种类型(域到共域)的函数,例如M ? M。为什么操作?是定义中域的一部分?第二个困惑是关于I。为什么是I域名?根本没有I对象Monoid。它只是对象的中性元素M

我知道这Monoid是一个具有一个对象,同一性同态和在该对象上定义的二进制运算的类别,但是这种表示法使我认为我不了解某些内容。

M ? M莫名其妙相关笛卡尔积,因此该射的域定义M x M

编辑:数学栈交换上,我的问题得到了非常有帮助的答案。

dup*_*ode 19

M ? M一些如何与笛卡尔积,因此该射的域定义M x M

究竟。更具体地讲,我们得到那些被表达类群Monoid从类基地采摘Hask(该类别所有的Haskell类型为对象,所有的Haskell功能态射)为Ç(,)(对类型构造)作为()(单位类型),为。的签名,翻译成Haskell,然后变成:

? :: (M, M) -> M
? :: () -> M
Run Code Online (Sandbox Code Playgroud)

通过诅咒,并利用() -> M函数与M值一一对应的关系(它们\() -> m对于某些人来说都是相似的m),我们得到了熟悉的Monoid方法:

mappend :: M -> M -> M
mempty :: M
Run Code Online (Sandbox Code Playgroud)

请注意,分类定义远不止于Monoid。例如,我们可能会继续工作在Hask在更换(,)()他们的对偶,EitherVoid,从而获得:

? :: Either A A -> A
? :: Void -> A
Run Code Online (Sandbox Code Playgroud)

每个Haskell类型都以这种特定方式是一个monoid (either id idabsurd)。


另一个例子是将C设为Haskell Functor的类别(它们之间具有自然变换-我将写为type f ~> g = forall a. f a -> g a-态射),Compose,并Identity

-- Note the arrows here are ~>, and not ->
? :: Compose M M ~> M
? :: Identity ~> M
Run Code Online (Sandbox Code Playgroud)

这两个通常写为:

-- "Inlining" the definitions of Compose, Identity, and ~>
join :: M (M a) -> M a
return :: a -> M a
Run Code Online (Sandbox Code Playgroud)

换句话说,a MonadFunctors 类别中的一个类群(这是Hask特定的版本,“ monad是一个内窥镜类别中的一个类群”)。值得一提的是,就像在另一个示例中一样,这不是将类人猿从该类别中删除的唯一方法(有关指针,请参见此答案的最后一段-实际上,其他内容可能与阅读有关,因为它讨论了等分类别的概念)。