A monad is just a monoid in the category of endofunctors, what's the problem?
作為一個(gè)計(jì)算機(jī)工作者毫缆,這句話對(duì)你造成過(guò)多少點(diǎn)的裝逼傷害泳唠?是時(shí)候弄明白這句話的意思了缭保。
搞清楚Monad需要了解的概念
1. Category:?
注意:
1. Category與集合不同,不只包括元素(objects)恩闻,還包括了元素之上的態(tài)射(morphisms),態(tài)射的二元運(yùn)算°還需滿足結(jié)合律(associativity),并且對(duì)identity的存在性有要求挺邀。
2. 給定Category C,C的元素ob(C)是一個(gè)類(class)跳座,類是比集合(set)大的一個(gè)概念端铛,兩者區(qū)別可以從羅素悖論(Russell paradox)進(jìn)一步了解。如果不想分散注意力疲眷,暫時(shí)可以認(rèn)為該類就是一個(gè)集合禾蚕。
3. 二元運(yùn)算是態(tài)射的運(yùn)算,不是元素的
2. Functor
Functor是個(gè)范疇與范疇之間的映射(mapping)狂丝』幌可以看作是范疇間的同態(tài)(homomorphism),其特點(diǎn)是保留結(jié)構(gòu)(structure-preserving)的几颜,所謂結(jié)構(gòu)保留體現(xiàn)在不只映射元素倍试,同時(shí)映射態(tài)射。如下圖所示:
根據(jù)范疇的定義蛋哭,很自然的可以得出:
3. Endofunctor
A functor that maps a category to itself.
endofunctor的概念很簡(jiǎn)單县习,但是,是不是endofunctor就是identity functor呢?并不是躁愿,如果那樣想叛本,就是給endofunctor額外的限制了。試著看下圖
再來(lái)一圖
4. Natural transformations
一句話解釋彤钟,自然變換(Natural Transformation)就是對(duì)于屬于Category C的任意X来候,F(xiàn)(X)到G(X)之間態(tài)射的集合。注意F(X)與G(X)都屬于Category D样勃。類比于codomain吠勘,自然變換在"co-category"上。
5. Monad
Monad簡(jiǎn)單說(shuō)就是1+2峡眶,1個(gè)endofunctor+2個(gè)natural transformations剧防。
η的含義比較簡(jiǎn)單,根據(jù)定義辫樱,1c是identity functor峭拘,顯然是一個(gè)特殊的endofunctor。根據(jù)自然變換的定義1c->T不能理解狮暑。
μ的含義需要先理解T°T的意思鸡挠,即對(duì)范疇進(jìn)行兩次mapping,不難得出T°T依然是endofunctor搬男。
看個(gè)圖:
看看什么是a monoid in the category of endofunctors
1. Monoid
2. The category of endofunctors
這個(gè)Category我們記作[C,C]拣展,簡(jiǎn)單說(shuō),就是所有C->C的endofunctors構(gòu)成的范疇缔逛,這個(gè)范疇的元素是endofunctors备埃,態(tài)射是自然變換。注意褐奴,[C,C]是一個(gè)monoidal category按脚,這個(gè)在網(wǎng)上可以找到證明,此處不贅述敦冬。
So, A monad is a monoid in the category of endofunctors
到此時(shí)辅搬,很容易發(fā)現(xiàn),什么是monad的兩種描述脖旱,本質(zhì)上描述的是相同的東西堪遂。就是一個(gè)1+2(1個(gè)endofunctors,加2個(gè)特殊的自然變換)
注意
wiki上還有定義說(shuō)monoid是一個(gè)滿足特殊條件的 Set萌庆,那到底monoid是Set還是Endofunctor呢溶褪?我在另外一篇文章做了解釋。