动机
1.以抽象的方法处理数学概念,将这些概念形式化成一组组的“物件”及“态射”。数学中许多重要的领域可以形式化为范畴。使用范畴论可以令这些领域中许多难理解、难捉摸的数学结论更容易叙述证明
2.研究范畴就是试图以“公理化”的方法抓住在各种相关连的“数学结构”中的共同特性,并以结构间的“结构保持函数”将这些结构相关起来
3.以群为例,其态射为群同态。两个群间的群同态会严格地“保持群的结构”,这是个以将一个群中有关结构的讯息运到另一个群的方法,使这个群可以看做是另一个群的“过程”。因此,对群同态的研究提供了一个得以研究群的普遍特性及群公理的推论的工具
4.范畴论研究结构,结构有点核心基石的感觉,比如如果没有数字2质数体系就不存在,因为无法满足每个数的质数乘积表示是唯一的。比如(0,1)加法,(-1,1)乘法,(0,180)旋转,本质是相同的。在范畴论里面会用箭头来表示这个结构
范畴是什么
1.范畴可以理解成集合加上额外的元数据,这些额外元数据描述两个对象相互关联的所有方式,包括描述两个对象等价的所有方式
2.对一个对象的认识,可以是看它的组成(细分再细分:分子,原子,原子核,等等 [公式] ),这是集合论的思想,但是也可以是看它与其他对象的关系,这是范畴论的思想
3.所有的集合组成一个范畴,所有的线性空间组成一个范畴,所有的群组成一个范畴,所有的流形也组成一个范畴,因此范畴是集合、线性空间、群、流形的抽象。互联网可以看做一个范畴,facebook也可以看做一个范畴。
4.范畴最容易理解的一个例子为集合范畴,其物件为集合,态射为集合间的函数。但需注意,范畴的物件不一定要是集合,态射也不一定要是函数
5.一个数学概念若可以找到一种方法,以符合物件及态射的定义,则可形成一个有效的范畴,且所有在范畴论中导出的结论都可应用在这个数学概念之上
基本概念
1.范畴(Category),范畴包含实体对象,实体对象间的映射,映射能够复合并且符合结合律,存在单位映射而且单位映射复合之后保持之前的映射不变
2.函子(Functor),再抽象化一次,范畴自身亦为数学结构的一种,因此可以寻找在某一意义下会保持其结构的“过程”;此一过程即称之为函子。函子将一个范畴的每个物件和另一个范畴的物件相关连起来,并将第一个范畴的每个态射和第二个范畴的态射相关连起来。实际上,即是定义了一个“范畴和函子”的范畴,其元件为范畴,(范畴间的)态射为函子。
3.自然变换(natural transformation),将一个函子映射至另一函子的方法,再抽象化一次基于函子范畴。函子范畴,两个范畴之间的所有函子形成的范畴,态射是函子间的自然变换。
4.群,一个集合以及定义在这个集合上的二元运算,满足群的四条公理,封闭性、结合性、单位元、反元素
5.幺半群(Monoid),只有单位元和二元运算,没有反元素的群。可以看成只有一个元素的范畴,任何箭头都是可复合的,这些箭头不一定是恒等,比如对于整数集合(一个元素)+1映射,所有这样的映射(箭头)组成的集合相当于一个能乘但不一定能除的集合像自然数,所以有一个只有一个元素的范畴就是一个幺半群。
6.同构(isomorphism),指的是一个保持结构的双射。在更一般的范畴论语言中,同构指的是一个态射,且存在另一个态射,使得两者的复合是一个恒等态射。可以简单的认为是范畴论体系下面的=
7.等价范畴,对其中一个范畴成立的定理,可以既定地转换成另一个范畴的定理。用来描述这种情形的主要方法是“范畴的等价性”,由函子给出
8.泛性质,小明和他的父亲大明之间存在态射“小明的父亲是大明”。而这个态射又可以分解为态射“小明的母亲是大红”和态射“大红的丈夫是大明”的组合 。而如果存在这样一种态射,范畴内的所有态射都可以分解为该态射和另一种态射的组合。则称该态射在该范畴内是一种“具有泛性质的态射”,简称“泛态射”。所有“性质”所拥有的性质就是“泛性质”
9.hask范畴,对象是haskell里面的所有类型,态射是haskell里面所有的函数。因为haskell里面的所有的函数理论上都可以是non-terminating的,所以所有的haskell type都可以被认为是lifted过的,所以才有一个新的category来描述
10.伴随函子,一个范畴C可以通过函子G到D,再通过函子F回到 C,那么F和G就是伴随函子
11.同态(homomorphism),不是双射只是单射,比如x=x+2是同构,x=x^2是同态
12.hom-set,一个范畴中两个object A B间所有的态射的集合
13.hom-functor,把object a 映射成 a->x的集合的functor
14.natural isomorphism 自然变换而且两边同构,所以也是可逆的自然变换。
15.representable functor,和hom-functor自然同构的都是reprentable a和f a -> x 两个范畴之间存在的functor叫做Representable,这个functor可以看做一种带key的记忆,通过key来记录f运行后的值,所以Representable有两个操作tabulate和index
16.adjunction 同构太强要求太高,一个偏弱点的结构是adjunction,两个范畴C,D,两个functorL,R 如果RL是d->d',然后通过另一个映射unit能d->d',L到c'另一个映射counit c'-c,然后R到d 这样的弱一些的关联叫adjunction,另一个等价的说法是 𝐂(𝐿𝑑, 𝑐) 𝐃(𝑑, 𝑅𝑐) 同构,这两个都是hom-set
重要结构的理解
Initial/Terminal Object
1.初始对象S是对于范畴内所有其它对象X有且仅有一个态射f:S->X。比如偏序集合范畴里面最小的元素(有的偏序集合没有Initial比如整数),比如普通集合和函数的范畴里面的empty set(haskell里面Void)
2.终点对象T是范畴内所有其它对象X有且仅有一个态射f:X->T。比如偏序集合里面的最大元素,比如普通集合范畴里面的singleton(haskell里面的(),函数是unit)
3.对偶性,对于原来的范畴定义一个对偶范畴,里面所有箭头反向,那么新范畴里面的初始和终点对象也会对换。箭头反向是范畴论研究常用的套路。
2.pullback就是把上面的关系反向
3.pushout/pullback描述的结构的一个重要特点是两个态射共享定义域(domain)或者值域(codomain)
Products/Coproducts
1.Products是指对于对象Ai 有一个对象P以及一组态射gi:P->Ai,其中P是满足条件的对象组成的子范畴中的终点对象。这里终点对象的意义在于可以把P'->Ai分解成P->Ai和P'->P的复合
2.Coproducts是指对于对象Ai 有一个对象P以及一组态射gi:Ai->P,其中P是满足条件的对象组成的子范畴中的起点对象。coproducts可以类比成加法。
3.在haskell中products是一个tuple (a,b)和两个函数fst,snd,coproducts是data Either a b = Left a | Right b
Limits/Colimits
1.对于任意一个转换图有对象Ai和态射ai,Limit是指对象L以及一些列态射li,li:L->Ai和lj:L->Aj,ax:Ai->Aj,ax.li=lj L是所有满足上面条件的对象组成的子范畴中的终点对象。
2.Colimits就是把上面的图像反过来
3.终点对象,pullbacks,products是limits的特例,初始对象,pushouts,coproducts是colimits的特例
Free Monoids
比如free monoid里面的list,对于[2],[3]只是append成[2,3]而不是[6],这种结构只是简单的累积参数而不是把信息隐含在映射中,有点lazy evaluation的意思。
在free forgetful adjunction结构中左边范畴的映射少因为要保持更多的结构,右边的映射多,但是两边的hom-set要同构,这说明对于往左的Functor F,必须包含必须的结构无关的对象,结构无关的对象叫做free object,个人理解[2,3]这种是结构无关,[6]这种是结构有关
Monad
1.首先是Monad是自函子范畴上的一个幺半群,自函子范畴是因为Monad要做函数复合,如果in和out的范畴不同就没法玩了。幺半群是因为Monad的动机是要做不断的复合同时保持结构,能想象到的类似的结构就是幺半群,按幺半群的定义乘法(tensor product)是复合,单位元是id functor,天然满足结合律。也可以这样理解,不是所有的endofunctor都是Monad,而是定义了复合而且满足幺半群条件的自函子才是Monad
2.上面的说法容易有的一个理解的误区是自函子作用的范畴,容易理解成a->M a 所以就成了不同的范畴,但实际上a和M a可以在一个更大的范畴中,就像hask范畴包含所有的基础类型以及之上的复合类型
3.从功效角度看想做连续的函数复合,只要f的返回类型和g的参数类型一致就行了,但这样要求太严格,而且无法传递函数外的信息,所以需要一个通用结构来传递函数外的信息,简单看就是在返回值上面包一层,这就成了Monad
4.还有一个Kleisli维度的说明,但Kleisli范畴本来就是定义在Monad之上的范畴,object是一般范畴的object本身,而映射是a->M[b]这种,这样的范畴就是Kleisli范畴
Yoneda Lemma
1.描述上是说C(a,x)到F(x)之间的自然变换和F(a)有一一对应的关系
2.可以分两步看这个关系,首先固定x到a变成C(a,a),这个时候任取C(a,a)的一个点p'会对应一个函数g,这个函数g又通过functor F一传导就变成了Fg,把F里面的点q(对应id),变成了q'所以p确定q就确定就是个固定的函数然后放开x,类似的𝑞′ = (𝐹𝑔)𝑞,只要选了g就能确定q。
3.这个里面的魔法是p能通过functor和id函数进行传导绑定到q,本来f和C里面的元素都可以随意变化,但在hom-functor里面进行了强行锁定,绑定后真正在变化的只有g,而信息的核心就是a,C(a,a)里面的点p,F(a)里面的点q
4.米田引理的意义是hom-functor的信息是最完整的,通过对hom-functor做自然变换得到的functor可能会损失信息
5.在haskell里面有 forall x . (a -> x) -> F x ≅ F a ,米田引理说明这两种表示,信息量相同。把F换成id,就得到了continuation的表示
6.把C(a,-),C(b,-)看成元素得到的category,这个过程叫Embedding,C->[C,Set],这个过程是完全保持结构的,这个过程的价值在于可以通过对Set的了解去反过来研究C(感受不到...)
F-Algebras
1.把一个代数体系中的基本运算用| encoding在一起就是一个F-algebra比如 type Algebra f a = f a -> a比如 data RingF a = RZero | ROne | RAdd a a | RMul a a | RNeg a
2.不动点Fix f=f (Fix f) 因为代数系统通常是能递归的,看到Fix可以理解成把f多应用一次
3.F-Algebras范畴,object是a和F组成的代数系统,(a,f)->(b,g)是映射,假设原生范畴有m:a->b 那F m:: F a -> F b
4.Catamorphisms,这个东西描述一个递归的代数系统和一个普通代数系统的关系,定义cata alg = alg . fmap (cata alg) . unFix cata传入一个普通代数系统,返回一个递归代数系统到具体值类型a的函数
5.Coalgebras 把F-Algebras的箭头反向,a->F a 定义ana coalg = Fix . fmap (ana coalg) . coalg 经典的例子是data Stream e = Stream e (Stream e) 一个例子是把stream映射到primes
6.foldr本质上说是特殊化版本的cata,也可以看到cata有多抽象,同时可以学到一个经典的patter,通常用commute图分解一个态射,看起来是走了一圈,其实是分解了,感觉用functor lift一下然后再回去也是这种技巧
Lawvere Theories
1.再次领教范畴论终极大招,为了研究一个复杂的范畴投影到一个简单的范畴
2.Lawvere理论是为了抽象所有的代数运算体系(algebra),代数体系都是先选定一个定义域比如整数,实数,复数,然后代数运算都是n个参数运算出一个结果在范畴论的语言里面可以表达为
alpha::a^n->a
3.Lawvere理论的做法是把代数体系表达成一个L范畴,L范畴可以被映射到一个更简单的基于集合的范畴FinSet,集合范畴的object就是0个元素的集合,1个元素的集合,2个元素的集合。。。但直接这样映射有些关系对应不上所以先选择一个同构的集合F去掉n个元素集合的多种表达方式,在用F的逆范畴IF把*转换成+,这样就完成了映射,可以在IF里面研究L了
4.L范畴里面的关键信息是那些定义n-ary操作的态射,所以的L组成一个范畴Law,Law里面的态射举个例子可以是从加法群映射到乘法幺半群
没有评论:
发表评论