在理解Functor以前,必須對抽象代數的範疇論有所瞭解,有範疇論的知識做爲鋪墊,感受Functor也不是那麼的難以理解了。編程
一個範疇C包括:函數
一個由對象所構成的類ob(C)
spa
對象之間的態射所構成的類hom(C)。每個態射f都會有一個「源對象」a和「目標對象」b,且a和b 都在ob(C)以內。所以寫成f:a -> b,且稱f爲由a到b的態射。全部a到b的態射所構成的「態射類」, 其標記爲hom(a,b)或者homC(a,b)。
orm
對三個對象a、b和c,二元運算hom(a,b) * hom(b,c) -> hom(a,c)稱之爲態射覆合;f :a -> b 和g : b -> c 的複合寫成g . f 或者gf。
對象
態射覆合知足下列公理:接口
(結合律)若f:a -> b、g:b -> c且 h:c -> d,則 h.(g.f) = (h.g).f;it
(單位元)對任一對象x,存在一態射1x:x -> x,使得每一態射f:a -> b,都會有1b.f = f = f.1a。 此態射稱爲「x的單位態射」。 margin
千萬別被這些概念嚇到了,從編程者的角度考慮,範疇就是一種抽象,一種interface,理解一個抽象接口最好的方式就是看它的具體實現,而範疇最容易理解的一個具體就是Set,集合,咱們高中就接觸過的東西。一個集合就是一個範疇,咱們看看它是怎麼知足的:top
它的對象是集合的元素集合
它的態射就是集合之間的映射(函數)
它的態射覆合就是映射的複合(函數的複合)
瞭解了範疇的概念,接下來咱們在看看函子,函子究竟是個什麼東西呢?下面看它的定義:
設C和D爲範疇,從C到D的函子爲一個映射F:
將每一個對象X <- C 映射到一個對象 F(X) <- D 上,
將每一個態射f : X -> Y <- C 映射至一態射 F(f) : F(X) -> F(Y) <- D上
看函子的定義知道了函子的做用大概就是把一個範疇轉換爲另外一個範疇,因此函子是範疇間的一種映射。
若是咱們把函子在抽象一層的話,會發現函子也是遵循着範疇的定義,下面看看:
它的對象是函子(一個把一個範疇映射到另外一個範疇的東西)
它的態射是天然變換
它的態射覆合就是天然變換之間的複合
因此咱們的函子也是知足範疇的定義,它自身也夠成了一個範疇,叫作函子範疇。而後咱們還有一種特殊的函子,它是把一個範疇映射到自身,它叫自函子。