Answers:
类别构成一个(大)类别,其对象是(小)类别,其态射是小类别之间的函子。从这个意义上说,范畴论中的函子是“更高尺寸的态射”。
ML函子不是该词的范畴意义上的函子。但是从类型理论的意义上讲,它们是“更大尺寸的函数”。
将典型编程语言中的具体数据类型视为“小”。因此int
,bool
,int -> int
等都是小的,在Java类是小的,如C.以及结构我们可能会收集所有数据类型到一个名为大集合Type
。A型的构造,诸如list
或者array
是从函数Type
到Type
。因此,这是一个“大”功能。ML函子只是一个稍微复杂的大型函数:它接受几个小东西作为参数,并返回几个小东西。“几个小东西放在一起” 在ML中称为结构。根据马丁·洛夫类型理论,我们有一个小类型的宇宙 Type
。大类型通常称为种。因此,我们有:
42 : int
)Type
(例如:int : Type
)OrderedType
)list : Type -> Type
)String : OrderedType
)Map.Make : Map.OrderedType -> Make.S
)现在我们可以在ML和类别之间进行类比,其中函子对应于函子。但是我们还注意到ML中的数据类型就像“没有形态学的小类别”,换句话说,它们比像类别更像集合。我们可以在机器学习和集合论之间进行类比:
标准ML结构类似于代数。它的签名描述了一整类相似形状的代数。
标准ML函子是从一类代数到另一类代数的映射。例如,使用仿函数进行类比,或者将添加一个与阿贝尔群相关的可乘单极体,使它们成环。 ˚F :甲b → ř Ñ 克
这些想法大多数由Burstall和Goguen在设计称为CLEAR的规范语言的系列论文中提出(DBLP页面上的参考c5和c6 。)David MacQueen当时与Burstall和Sannella一起工作,并且非常熟悉与问题。标准ML模块系统基于这些思想。
大多数人会想知道的是,射影呢?范畴理论函子具有一个对象部分和一个态射部分。标准ML函子具有相同的值吗?答案是是和否。
这是否意味着Standard ML偏离了类别理论?我不这么认为。我宁愿认为Standard ML做正确的事,并且类别理论还没有赶上。范畴论尚不知道如何处理高阶函数。有一天,它将。
在那里,是对我所知,与没有正式的关系函子范畴论和函子在ML(SML或者Ocaml,他们是足够接近我们的目的在这里)。
在范畴论中,函子是对对象进行操作的函数。它们是态射态之上的一个层次,态射态通常是对元素进行操作的功能(许多类别的对象具有某些代数结构,而箭头则是这些结构之间的同态)。ML函子是在模块上运行的功能,比在核心语言值上运行的功能高一级。我认为相似之处到此为止。
ML函数是Dave McQueen在1985年修订的ML标准模块 (citeseerx)中受洗的,该模块出现在“ 多态性通讯”中(原始论文使用“参数模块”一词-后来的出版物倾向于使用形容词“参数化”)。不幸的是,我找不到那张纸的副本。他在1986年的论文《使用从属类型表示模块化结构》 (citeseerx)中给出了已建立的名称。