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在更换(,)和()他们的对偶,Either和Void,从而获得:
? :: Either A A -> A
? :: Void -> A
Run Code Online (Sandbox Code Playgroud)
每个Haskell类型都以这种特定方式是一个monoid (?是either id id,?是absurd)。
另一个例子是将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 Monad是Functors 类别中的一个类群(这是Hask特定的版本,“ monad是一个内窥镜类别中的一个类群”)。值得一提的是,就像在另一个示例中一样,这不是将类人猿从该类别中删除的唯一方法(有关指针,请参见此答案的最后一段-实际上,其他内容可能与阅读有关,因为它讨论了等分类别的概念)。