Haskell抽象概念Functor剖析

强颜欢笑 提交于 2019-12-18 16:57:53

【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>

在理解Functor之前,必须对抽象代数的范畴论有所了解,有范畴论的知识作为铺垫,感觉Functor也不是那么的难以理解了。


一个范畴C包括:

    •  一个由对象所构成的类ob(C)

    •  对象之间的态射所构成的类hom(C)。每一个态射f都会有一个“源对象”a和“目标对象”b,且a和b  都在ob(C)之内。因此写成f:a -> b,且称f为由a到b的态射。所有a到b的态射所构成的“态射类”,  其标记为hom(a,b)或者homC(a,b)。

    •  对三个对象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;

    • (单位元)对任一对象x,存在一态射1x:x -> x,使得每一态射f:a -> b,都会有1b.f = f = f.1a。  此态射称为“x的单位态射”。     


千万别被这些概念吓到了,从编程者的角度考虑,范畴就是一种抽象,一种interface,理解一个抽象接口最好的方式就是看它的具体实现,而范畴最容易理解的一个具体就是Set,集合,我们高中就接触过的东西。一个集合就是一个范畴,我们看看它是怎么满足的:

    • 它的对象是集合的元素

    • 它的态射就是集合之间的映射(函数)

    • 它的态射复合就是映射的复合(函数的复合)


了解了范畴的概念,接下来我们在看看函子,函子到底是个什么东西呢?下面看它的定义:

设C和D为范畴,从C到D的函子为一个映射F:

    • 将每个对象X <- C 映射到一个对象 F(X) <- D 上,

    • 将每个态射f : X -> Y <- C 映射至一态射 F(f) : F(X) -> F(Y) <- D上

看函子的定义知道了函子的作用大概就是把一个范畴转换为另一个范畴,所以函子是范畴间的一种映射。


如果我们把函子在抽象一层的话,会发现函子也是遵循着范畴的定义,下面看看:

    • 它的对象是函子(一个把一个范畴映射到另一个范畴的东西)

    • 它的态射是自然变换

    • 它的态射复合就是自然变换之间的复合

所以我们的函子也是满足范畴的定义,它自身也够成了一个范畴,叫做函子范畴。然后我们还有一种特殊的函子,它是把一个范畴映射到自身,它叫自函子。


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!