SML中的函子和范畴论之间有什么关系?


24

Andrej Bauer在此答案中的陈述相同的想法

Haskell社区开发了许多受类别理论启发的技术,其中最著名的是monad,但不应将其与monad混淆。

之间是什么关系仿函数的SML和函子范畴论?

由于我不了解其他语言(例如Haskell或OCaml)中函子的详细信息,因此,如果有有价值的信息,请同时添加其他语言的部分。


1
我想,您可以尝试给Dave McQueen发送电子邮件,以获得确切的答案。
吉尔斯(Gillles)“所以-别再邪恶了”

Answers:


14

类别构成一个(大)类别,其对象是(小)类别,其态射是小类别之间的函子。从这个意义上说,范畴论中的函子是“更高尺寸的态射”。

ML函子不是该词的范畴意义上的函子。但是从类型理论的意义上讲,它们是“更大尺寸的函数”。

将典型编程语言中的具体数据类型视为“小”。因此intboolint -> int等都是小的,在Java类是小的,如C.以及结构我们可能会收集所有数据类型到一个名为大集合Type。A型的构造,诸如list或者array是从函数TypeType。因此,这是一个“大”功能。ML函子只是一个稍微复杂的大型函数:它接受几个小东西作为参数,并返回几个小东西。“几个小东西放在一起” 在ML中称为结构。根据马丁·洛夫类型理论,我们有一个小类型的宇宙 Type。大类型通常称为。因此,我们有:

  1. 值的类型的元素(例如:42 : int
  2. 类型是元素Type(例如:int : Type
  3. ML签名种(例如:OrderedType
  4. 类型构造器是种元素(例如:list : Type -> Type
  5. ML是钢结构种元素(例如:String : OrderedType
  6. 仿函数ML是种之间的功能(例如:Map.Make : Map.OrderedType -> Make.S

现在我们可以在ML和类别之间进行类比,其中函子对应于函子。但是我们还注意到ML中的数据类型就像“没有形态学的小类别”,换句话说,它们比像类别更像集合。我们可以在机器学习和集合论之间进行类比:

  1. 数据类型就像集合
  2. 种类就像集合论课
  3. 函子就像类大小的函数

15

标准ML结构类似于代数。它的签名描述了一整相似形状的代数

标准ML函子是从一类代数到另一类代数的映射。例如,使用仿函数进行类比,或者将添加一个与阿贝尔群相关的可乘单极体,使它们成环。 ˚F bř Ñ F:MonGrpF:AbRng

这些想法大多数由Burstall和Goguen在设计称为CLEAR的规范语言的系列论文中提出(DBLP页面上的参考c5和c6 。)David MacQueen当时与Burstall和Sannella一起工作,并且非常熟悉与问题。标准ML模块系统基于这些思想。

大多数人会想知道的是,射影呢?范畴理论函子具有一个对象部分和一个态射部分。标准ML函子具有相同的值吗?答案是是和否。

  • 如果结构是一阶的,则答案的是部分适用。然后,同一签名的不同结构之间存在同态,标准ML函数将它们自动映射为结果签名的同态。
  • 当结构具有高阶运算时,答案的否定部分适用。

这是否意味着Standard ML偏离了类别理论?我不这么认为。我宁愿认为Standard ML做正确的事,并且类别理论还没有赶上。范畴论尚不知道如何处理高阶函数。有一天,它将。


“分类理论还不知道如何处理高阶函数。” 这听起来像是另一个问题,因为我认为范畴论可以作为基础来完成所有工作。
Guy Coder

2
高阶函数的问题很容易说明。像的类型构造函数不是函子。应该会的。像的多态函数不是自然变换。应该会的。如果您阅读Eilenberg和MacLane,则他们呈现的直觉将涵盖这些情况。但是他们的理论却没有。他们的论文对1945 年来说是很棒的论文。但是,今天,我们需要更多。t w i c e X = T X T X T(X)=[XX]twiceX=T(X)T(X)
Uday Reddy

我实际上使它成为一个真正的问题
Guy Coder

“标准的ML结构类似于代数 ”。函子不是比这更笼统吗?没有什么可以阻止结构包含不相关的对象(类型,值和函数),即。没有形成代数
didierc

2
@didierc 代数的签名由一种或多种类型(如我们的类型),一个或多个运算(如我们的函数)以及可选的一些公理(如我们的规范)组成。签名的代数为这些种类选择特定的集合,并为这些操作选择特定的功能,以便满足公理。SML签名和结构正是这样的东西,除了SML允许高阶运算而Algebra不允许。
Uday Reddy 2013年

3

在那里,是对我所知,与没有正式的关系函子范畴论和函子在ML(SML或者Ocaml,他们是足够接近我们的目的在这里)。

在范畴论中,函子是对对象进行操作的函数。它们是态射态之上的一个层次,态射态通常是对元素进行操作的功能(许多类别的对象具有某些代数结构,而箭头则是这些结构之间的同态)。ML函子是在模块上运行的功能,比在核心语言值上运行的功能高一级。我认为相似之处到此为止。

ML函数是Dave McQueen在1985年修订的ML标准模块 (citeseerx)中受洗的,该模块出现在“ 多态性通讯”中(原始论文使用“参数模块”一词-后来的出版物倾向于使用形容词“参数化”)。不幸的是,我找不到那张纸的副本。他在1986年的论文《使用从属类型表示模块化结构》 (citeseerx)中给出了已建立的名称。


2
函子不仅是对象上的函数,还映射了态射。函子是“类别之间的态素”。
Andrej Bauer 2013年

@AndrejBauer是的,函子是对象上的函数。并非对象上的每个函数都是函子,但这是次要的考虑因素。
吉尔(Gilles)'所以
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.