我明明在努力工作,却隔三岔五都会遇到歧视这份职业的人。他们的眼神里,有着对反驳的胆怯与警戒,有时候,还藏着一种 “你敢反驳我便应战” 的好战光芒。

原本以为熟练在 Haskell 中用 Monad 和 Monad transformer 了,结果发现阅读文献碰到时还是绕不开数学。

# Monad 的前世今生

学习 Monad 的时候,如果我们想从数学角度理解,很容易就发现了这样的学习路程:

Haskell IO Monad->category theory->Kleisli category->Kleisli triple->algebraic theory\text{Haskell IO Monad->category theory->Kleisli category->Kleisli triple->algebraic theory}

所以我们直接从 algebraic theory 开始,从最抽象的一步步具化到 Monad。

我们基于集合论先进行讨论,然后再用范畴论的语言重述。

# 集合论语言

首先,我们定义一个极其抽象的,称之为 “operator domain” 的东西(用Ω\Omega 表示)。它是一个集合序列Ω(Ω1,Ω2,Ω3,...)\Omega\triangleq(\Omega_1,\Omega_2,\Omega_3,...)

它可以说是毫无信息量了,只表达一个信息:对于ωΩn\omega\in\Omega_n,我们将ω\omega 看作一个由nn 指向 1 的箭头。

Example

譬如Ω=({e},{i},{m},,,...)\Omega=(\{e\},\{i\},\{m\},\emptyset,\emptyset,...),可以用下图表示:

6

然后我们引入Ω\Omega-algebra 的概念。一个Ω\Omega-algebra 是一个 pair (X,δ)(X,\delta),其中XX 是一个集合,而δ\delta 是一系列函数,对于ωΩn\omega\in\Omega_n,有函数δω:XnX\delta_\omega:X^n\rightarrow X

Example

延续上面的Ω\Omega 定义,我们可以考虑这样一个Ω\Omega-algebra:

X={0,1}δe:1δi:00,11δm:(0,0)0,(0,1)1,(1,0)1,(1,1)0\begin{aligned} & X=\{0,1\}\\ & \delta_e:\bot\mapsto 1\\ & \delta_i:0\mapsto 0,1\mapsto 1\\ & \delta_m:(0,0)\mapsto 0,(0,1)\mapsto 1,(1,0)\mapsto 1,(1,1)\mapsto 0 \end{aligned}

可以看出来,(X,δ)(X,\delta) 其实把Ω\Omega 中的ee "翻译" 成了单位元,ii 翻译成了逆元,mm 翻译成了模 2 加法。

对一个集合AA,实际上我们可以定义AΩA\Omega 是一个集合,里面的元素被称为 "terms",是由A+ΩA+\Omega 中的 symbol 组成的 “合法字符串”。

这个说法很抽象,不妨看一个例子

Example:

延续上面Ω\Omega 定义,我们可以考虑A={x,y,z}A=\{x,y,z\} 时,那么下面的字符串都是AΩA\Omega terms:

x,xym,e,xi,xymzm,xyimAΩx,xym,e,xi,xymzm,xyim\in A\Omega

实际上,“合法” 体现在可以被当作后缀表达式 parse 掉。譬如xymxym 因为mΩ2m\in\Omega_2,可以把它看作一个二元运算符,前面就需要加两个合法的AΩA\Omega 中的 terms。而xixi 因为iΩ1i\in\Omega_1 所以前面只需要加一个 term 就好。

可以注意到,严格来说我们是A+ΩA+\Omega,但实际中我们几乎默认AAΩ\Omega 没有公共元素(AA 看作 elements,Ω\Omega 看作 operations)所以往往直接写x,y,mx,y,m 而不是(x,0),(y,0),(m,1)(x,0),(y,0),(m,1)

我们继续可以引入Ω\Omega-equations 的概念。它也是一个集合,而集合中的元素全部是二元集合。

我们给定一个毫无意义,但是方便 enumerate 的集合V={v1,v2,v3,...}V=\{v_1,v_2,v_3,...\} 表示抽象的 variable,那么看一个例子:

Example:

延续上面Ω\Omega 的定义,我们可以定义Ω\Omega-equations:

E={{v1v2mv3m,v1v2v3mm},{v1v1im,e},{v1iv1m,e}}E=\{\{v_1v_2mv_3m,v_1v_2v_3mm\},\{v_1v_1im,e\},\{v_1iv_1m,e\}\}

虽然看起来很奇怪,但是仔细理解,可以发现它表达了(v1+v2)+v3=v1+(v2+v3)(v_1+v_2)+v_3=v_1+(v_2+v_3),还有v1+(v1)=0v_1+(-v_1)=0 这种含义。

然而这个EE 之所以使用的是二元集合而不是等号,是因为VΩV\Omega 中的 terms 是无法判等的!只能等它被某个Ω\Omega-algebra 解释后,才可以去判等。

定义好Ω\OmegaEE 后(对于某个VV),那么(Ω,E)(\Omega,E) 就被称为一个 equational presentation

因为实际上,它只定义了一些 operations 的 domain,还有一些 equational relation。剩下我们一无所知。这个 operation 是什么?加法?这个 equational 是什么?同构?相等?v1,v2v_1,v_2 是什么?整数?我们都不知道!这就是抽象。

然而有了Ω\Omega-algebra,这就都不一样了!我们知道了元素是XX 中的,我们知道了应该怎样运算(利用δ\delta)。

Example:

给定Ω\Omega-algebra (X,δ)(X,\delta) 后,很显然我们得到了一被称为 total description map 的东西:δ:XΩX\delta^*:X\Omega\rightarrow X,递归定义为:

xδ=xp1p2...pnωδ=p1δp2δ...pnδδωx\delta^* =x\\ p_1p_2...p_n\omega\delta^* =p_1\delta^*p_2\delta^* ...p_n\delta^* \delta_\omega

仔细看看就知道它这是在利用δ\delta 在进行计算!计算结果就还是XX 中的元素。

那么,给定一个r:VXr:V\rightarrow X 把抽象的 variable 映射到具体的XX 中的元素,很显然我们可以诱导出r:VΩXΩXr^\dagger :V\Omega\rightarrow X\Omega\rightarrow X。即我们先把VΩV\Omega 中 terms 里的 abstract variable 换成XX 中的元素,再利用δ\delta^* 进行计算。

此时我们可以引出(Ω,E)(\Omega,E)-algebra 的定义了!(注意,之前的 algebra 是没有EE 的)

(Ω,E)(\Omega,E)-algebra 是一个Ω\Omega-algebra (X,δ)(X,\delta),并且XX 中的元素是可以判等的。

对于任意的 assignment r:VXr:V\rightarrow X,都有EE 中的 equation 条件被满足(相等)。

注意,这里说了对于任意 assignment,实际上也就是x+(x)=0x+(-x)=0 for all xx 的意思。而这里的 for all 体现在把 abstract variable 映射到具体元素函数rr 的任意上。

能用Ω,E,δ,X\Omega,E,\delta,X 这样定义出的(Ω,E)(\Omega,E)-algebra 被称为 equationally definable class of algebra

于是对于任意 set AA,如果我们有 function f:AXf:A\rightarrow X,那就可以自然地 extend 出一个f:AΩXf^\dagger:A\Omega\rightarrow X 的出来。

之前说了,VΩV\Omega 中的 terms 是无法判等的,那么现在给定一个 equational presentation (Ω,E)(\Omega,E),和一个任意的集合AA,我们定义一个AΩA\Omega 上的等价关系:

EA={(p,q)AΩ×AΩfor all (Ω,E) algebra (X,δ) and functions f:AX,f#p=f#q}E_A=\{(p,q)\in A\Omega\times A\Omega\mid\text{for all }(\Omega,E)\text{ algebra }(X,\delta)\text{ and functions }f:A\rightarrow X,f^\#p=f^\#q\}

Example:

沿用之前的定义:

Ω=({e},{i},{m},,...)E={{xymzm,xyzmm},{xxim,e},{xixm,e},{exm,x},{xem,x}}\Omega=(\{e\},\{i\},\{m\},\emptyset,...)\\ E=\{\{xymzm,xyzmm\},\{xxim,e\},\{xixm,e\},\{exm,x\},\{xem,x\}\}

那么很显然,对于A={x,y,z}A=\{x,y,z\} 有:

p=xxximmAΩq=xAΩp=xxximm\in A\Omega\\ q=x\in A\Omega

p=qp=q。这是一件很自然的事,因为要满足EE,就自然会导致p,qp,q 在所有(Ω,E)(\Omega,E)-algebra 下是相等的。

EAE_A 的定义,就是把原先AΩA\Omega 这个不可比的集合,利用EE 而引入了等价关系变得可比!

我们记AT=AΩ/EAAT=A\Omega/E_ATT is for ‘‘theory’’),并且自然地引入一个映射Aρ:AΩATA\rho:A\Omega\rightarrow AT,也就是把pAΩ[p]ATp\in A\Omega\mapsto [p]\in AT

Example:

沿用上述的定义,实际上我们有:

[xxximm]=[xem]=[x][xxximm]=[xem]=[x]

它们都是一个等价类里的(可以看作是化简)

实际上,ATAT 就是一个(Ω,E)(\Omega,E)-algebra!这是怎么定义的呢?

XAT=AΩ/EA[p1][p2]...[pn]δω[p1p2...pnω]δω:ATnATX\triangleq AT=A\Omega/E_A\\ [p_1][p_2]...[p_n]\delta_\omega\triangleq[p_1p_2...p_n\omega]\\ \delta_\omega:AT^n\rightarrow AT

那么给定一个 equational presentation (Ω,E)(\Omega,E),我们可以定义:

The clone of (Ω,E)(\Omega,E) is a category named Set(Ω,E)\textbf{Set}(\Omega,E)

  • 它的 objects 是 sets A,B,C,...A,B,C,...
  • 它的 morphism ABA\rightharpoondown B 是 function ABTA\rightarrow BT
  • 它的 identity morphism 是Aη:AATA\eta:A\rightarrow AT
  • 它的 composition 定义为(AαB)(BβC)=AαBTβCT(A\xrightharpoondown{\alpha}B)\circ(B\xrightharpoondown{\beta}C)=A\xrightarrow{\alpha}BT\xrightarrow{\beta^\dagger}CT

Example:

考虑Ω=({e},{i},{+},,,...)\Omega=(\{e\},\{i\},\{+\},\emptyset,\emptyset,...),以及E=E=\emptyset。那么此时显然EA=E_A=\emptyset 对于任意AA,所以也有AT=AΩ/EA=AΩAT=A\Omega/E_A=A\Omega

假如我们有四个集合:

A={1}B={b,x}C={c,y}D={d,z}\begin{aligned} & A = \{1\}\\ & B=\{b,x\}\\ & C = \{c,y\}\\ & D = \{d,z\} \end{aligned}

然后有三个函数:

α:ABT=BΩβ:BCT=CΩγ:CDT=DΩ\begin{aligned} & \alpha:A\rightarrow BT=B\Omega\\ &\beta:B\rightarrow CT=C\Omega\\ &\gamma:C\rightarrow DT=D\Omega \end{aligned}

函数内容为:

α=1xie+b+β=xybcc+γ=cdz+iye\begin{aligned} & \alpha= &&1\mapsto xie+b+\\ & \beta= && x\mapsto y\\ & && b\mapsto cc+\\ &\gamma= && c\mapsto dz+i\\ & && y\mapsto e \end{aligned}

那么有:

α(βγ):ADT(αβ)γ:ADT\alpha\circ(\beta\circ\gamma):A\rightarrow DT\\ (\alpha\circ\beta)\circ\gamma:A\rightarrow DT

且:

(βγ)=bdz+idz+i+xeα(βγ)=1eie+dz+idz+i++(αβ)=1yie+cc++(αβ)γ=1eie+dz+idz+i++\begin{aligned} & (\beta\circ\gamma)= && b\mapsto dz+idz+i+\\ & && x\mapsto e\\ & \alpha\circ(\beta\circ\gamma)= && 1\mapsto eie+dz+idz+i++\\ & (\alpha\circ\beta)= && 1\mapsto yie+cc++\\ & (\alpha\circ\beta)\circ\gamma= && 1\mapsto eie+dz+idz+i++ \end{aligned}

所以有α(βγ)=(αβ)γ\alpha\circ(\beta\circ\gamma)=(\alpha\circ\beta)\circ\gamma

上个例子其实说明了,morphism 就是 substitution 的过程,也其实揭示了证明的内涵:证明某个命题,本质上就是一直在 substitute axiom 中的 variable

到这里或许读者已经初见端倪,为什么我们应该把 Monad 理解成一种 computation。

因为从只含有 variable 的集合AA,后面引入了Ω\Omega 中定义的 operations 得到AΩA\Omega,然后进一步引入了EE 中的相等关系得到了ATAT

AΩA\Omega 中的 terms 可以看作是表达式了,而ATAT 中的元素则可以看作有了EE 给的化简规则后,化简的结果。

而 terms in AΩA\Omega 就可以看作是证明(Curry-Howard 同构),morphism ABTA\rightarrow BT 就告诉我们,得到了一个ATAT 中的 terms,如何通过 substitution 得到一个BTBT 中的 term。

这时候,我们会发现没有 types 怎么办。所以我们需要引入 2-category!!

object 是 types,morphism 是 terms,然后 morphism 之间的 morphism 是 substitution。


以下为原始 note:

# 单位半群(Monoid)

” 这个相对简单,就是一个代数结构。当集合SS 上存在一个二元运算:S×SS*:S\times S\rightarrow S 和一个单位元eSe\in S 满足:

  1. aS,  ea=ae=a\forall a\in S,\;e*a=a*e=a.

  2. a,b,cS,  a(bc)=(ab)c\forall a,b,c\in S,\; a*(b*c)=(a*b)*c.

那我们就称集合SS 和这个运算、单位元形成了一个单位半群(幺半群,Monoid)

:自态射形成了一个 Monoid。考虑一个 category C\mathcal{C} 中只有一个元素aa 和很多 morphism,那么这些 morphism 都是从aaaa 的箭头,他们形成了一个 Monoid。其中SS 就是这些 morphism,二元运算是 morphism 的组合,单位元是 identity morphism。由于 category 的性质,故满足结合律和单位律,故形成了一个 Monoid。

# Monoidal Category

A monoidal category is a category C\mathcal{C} quipped with a monoidal structure:

  • a bifunctor :C×CC\otimes:\mathcal{C}\times\mathcal{C}\rightarrow\mathcal{C}.

  • an object II called the monoid unit.

  • three natural isomorphisms:

    1. for any three arguments A,B,CA,B,C, there is a isomorphism α\alpha:

      αA,B,C:A(BC)(AB)C\alpha_{A,B,C}:A\otimes (B\otimes C)\cong (A\otimes B)\otimes C

    2. for any argument AA, there are two isomorphisms:

      λA:IAAρA:AIA\lambda_A:I\otimes A\cong A\\ \rho_A:A\otimes I\cong A

  • the three natural isomorphisms should satisfy the coherence conditions:

    1. for all A,B,C,DCA,B,C,D\in\mathcal{C}, the following diagram commutes:

      1

    2. for all A,BCA,B\in\mathcal{C}, the following diagram commutes:

      2

关于这个定义,可以说明几点。

  1. 这个 monoidal structure 里的元素(譬如单位元),都是 category C\mathcal{C} 里面的 object。也就是说我们希望这个 category 本身就有一点 monoid 的结构。但是它不是一个 monoid 在于,结合律和单位律都是同构而不是相等。譬如在 category Set\textbf{Set} 中,就是集合的同构而不是集合的相等。{(a,(b,c))}\{(a,(b,c))\}{((a,b),c)}\{((a,b),c)\} 就是同构但不相等的。

  2. 其次下面的 coherence conditions 其实是,我们可以利用α\alpha 找出很多个诸如下面这种同构:

    (((A1A2)A3)...An)(A1(A1(A3...An)))(((A_1\otimes A_2)\otimes A_3)\otimes ...\otimes A_n)\cong(A_1\otimes (A_1\otimes (A_3\otimes ...\otimes A_n)))

    因为你可以选择拆括号时不同的顺序,从而选择α\alpha 的不同的 arguments。coherence condition 就说明,这些同构都应该是同一个。

:把 category Set\textbf{Set} 补充成一个 monoidal category。bifunctor 选择笛卡尔积,即AB={(a,b)aA,bB}A\otimes B=\{(a,b)\mid a\in A,b\in B\}。然后 unit object 选择为一个特殊的单元素集{}\{*\}。可以验证譬如{((1,2),3),((4,5),6)}{(1,(2,3)),(4,(5,6))}\{((1,2),3),((4,5),6)\}\cong \{(1,(2,3)),(4,(5,6))\},以及{(1,),(2,)}{1,2}\{(1,*),(2,*)\}\cong\{1,2\} 这样有自然的 isomorphism 满足要求和 coherence condition。

# Monoid in monoidal category

下面我们定义,在一个 monoidal category 上自然导出一个 monoid:

A monoid (M,μ,η)(M,\mu,\eta) in a monoidal category (C,,I)(\mathcal{C},\otimes,I) is an object MM together with two morphism μ,η\mu,\eta:

  • μ:MMM\mu:M\otimes M\rightarrow M called multiplication.
  • η:IM\eta:I\rightarrow M called unit.

such that the diagram commutes:

34

:考虑Set\textbf{Set} 是一个 monoidal category,那么我们选择其中一个 object,譬如M={0,1}M=\{0,1\}。那么MM={(0,0),(0,1),(1,0),(1,1)}M\otimes M=\{(0,0),(0,1),(1,0),(1,1)\}。我们可以找到一个 morphism μ\mu,即模 2 乘法:

μ(0,0)=0μ(0,1)=0μ(1,0)=0μ(1,1)=1\mu(0,0)=0\\ \mu(0,1)=0\\ \mu(1,0)=0\\ \mu(1,1)=1

对于η\eta,我们需要找到一个{}{0,1}\{*\}\rightarrow\{0,1\} 的映射,很显然有两个选择。如果我们选择η=0\eta_*=0 会怎样?那么第二个 diagram 将不 commute!因为IMη1MMμMI\otimes M\stackrel{\eta\otimes 1}{\longrightarrow}M\otimes M\stackrel{\mu}{\longrightarrow}M 就会有映射:(,1)(0,1)0(*,1)\mapsto(0,1)\mapsto 0,显然这和直接用消去映射λ(,1)=1\lambda(*,1)=1 得到的结果不一样。

所以我们需要选择η=1\eta_*=1,这样就满足了要求。这个例子也阐释了,我们是怎么利用已有的 monoidal category 中那些 monoid structure(即α,λ,ρ\alpha,\lambda,\rho)构造一个 monoid 的。

# Monad

最终我们定义一个特殊情况:Monad is a monoid in the (monoidal) category of endofunctors.

考虑一个 category C\mathcal{C},显然可以找到一个 category D\mathcal{D}

  • D\mathcal{D} 中的 object 是CC\mathcal{C}\rightarrow\mathcal{C} 的 functor。
  • D\mathcal{D} 中的 morphism 是 functor 之间的 natural transformation。

那么D\mathcal{D} 是一个 monoidal category:

  • 对于两个 functor F,GDF,G\in\mathcal{D}FG=FGDF\otimes G=F\circ G\in\mathcal{D}
  • I=1CI=1_{\mathcal{C}}C\mathcal{C} 上的 identity functor。

不难验证,这满足 monoidal category 的要求。实际上,D\mathcal{D} 是一个 strict monoidal category,因为根据 category 和 functor 的要求,实际上就有F(GH)=(FG)HF\circ(G\circ H)=(F\circ G)\circ H,即不是同构而是直接相等。

那么我们就可以找出D\mathcal{D} 中的一个元素和两个 morphism,然后导出一个 monoid,即是 monad:

A Monad on C\mathcal{C} consists of an endofunctor T:CCT:\mathcal{C}\rightarrow\mathcal{C} together with two natural transformations η:1CT\eta:1_{\mathcal{C}}\rightarrow T and μ:TTT\mu:T\circ T\rightarrow T.

They are required to make the following diagram commutative:

5

显然TTD\mathcal{D} 中的一个元素,而μ,η\mu,\eta 也对应了导出 monoid 在 endofunctor category 下的情况。而特别的地方在于,由于 endofunctor category 是 strict monoidal category,那么α,λ,ρ\alpha,\lambda,\rho 都是单位映射,即相等(因为在 category 里,要求了1CT=T1C=T1_{\mathcal{C}}\circ T=T\circ 1_{\mathcal{C}}=T)。所以图中省略了α\alpha 部分,把T(TT)T\circ (T\circ T)(TT)T(T\circ T)\circ T 直接合并了,而且在右图中将λ,ρ\lambda,\rho 改写为==

:我们仍考虑 category Set\textbf{Set},那么 powerset 实际上就是一个 Monad。考虑一个 endofunctor T(ASet)=2ASetT(A\in\textbf{Set})=2^A\in\textbf{Set},那么我们可以定义ηA:1Set(A)T(A)\eta_A:1_{\textbf{Set}}(A)\rightarrow T(A)ηA(aA)={a}\eta_A(a\in A)=\{a\},譬如对于A={1,2,3}A=\{1,2,3\},那么AηA{{1},{2},{3}}A\stackrel{\eta_A}{\mapsto}\{\{1\},\{2\},\{3\}\}

然后定义μA:T(T(A))T(A)\mu_A:T(T(A))\rightarrow T(A) 其实就是把集合 flatten 一层。譬如对于A={{{1,2},{3,4}},{{5}}}A=\{\{\{1,2\},\{3,4\}\},\{\{5\}\}\},那么AηA{{1,2,3,4},{5}}A\stackrel{\eta_A}{\mapsto}\{\{1,2,3,4\},\{5\}\}。这就形成了一个 Monad。

注意,实际上 functor TT 应该不仅描述了 object 间的映射关系,还需要说明 morphism 间的映射关系。而Set\textbf{Set} 上的 morphism 是集合之间的函数,那么对于 powerset 这个TT,一个很自然的映射就是把函数(譬如f(x)=x+1f(x)=x+1)apply 在 powerset 里的每个 set。

Edited on Views times