Answers:
嗯,关系参数化是约翰·雷诺兹(John Reynolds)提出的最重要的思想之一,因此看起来像魔术并不令人惊讶。这是关于他可能如何发明的童话。
假设您正在尝试将某些函数(标识,映射,折叠,列表反转)的作用“形式化为多种类型”的想法正式化,即,您对参数多态性有一些直观的想法,并且已经制定了一些规则用于创建这样的图,即多态微积分或其早期变体。您会注意到,朴素的集合论语义不起作用。
例如,我们盯着类型
偏序是相对的,传递的和反对称的。我们可以尝试改变结构,例如,我们可以尝试使用严格的偏序,线性顺序,等价关系或对称关系。但是,在每种情况下,都会出现一些不需要的示例。例如,对称关系消除了我们不需要的功能,但允许使用其他多余的功能(运动)。
然后您会注意到两件事:
因此,您有一个绝妙的想法,即所需的功能是保留所有关系的功能,并且关系模型诞生了。
\X:Type. \a:X. if X = {(0,0), (1,0), (0,1), (1,1)} then 0 else a
问题的答案确实存在于雷诺的寓言中(第1节)。让我尝试为您解释。
在将类型视为抽象的语言或形式主义中,类型变量可以代表任何抽象概念。我们不认为类型是通过某种类型术语的语法或某种类型的运算符的固定集合生成的,也不是我们可以测试两种类型的相等性等。在这种语言中,如果函数涉及类型变量,则唯一函数可以对该类型的值执行的操作是改组已给出的值。它不能发明该类型的新值,因为它不“知道”该类型是什么!这就是参数化的直观思想。
然后,雷诺(Reynolds)考虑了如何从数学上捕捉这个直观的想法,并注意到以下原则。假设我们实例化类型变量,说,两种不同的具体类型,说一和一',在不同的实例,并保留在我们的脑海一些信件[R :一↔ 一'的两个具体类型之间。然后,我们可以设想,在一个实例中,我们提供了一个值X ∈ 甲给功能,并且在其他情况下,一个相应的值X ' ∈ 甲' (其中,“对应”是指X和与 R关联。然后,由于该函数对我们为 t提供的类型或该类型的值一无所知,因此必须以完全相同的方式处理 x和 x '。因此,我们从函数中获得的结果应该再次与我们一直牢记的关系 R相对应,即,元素 x出现在一个实例的结果中的任何地方,元素 x '必须出现在另一实例的结果中。因此,参数多态函数应保留类型变量的可能实例之间的所有可能关系。
保持通信的这种想法并不新鲜。数学家对此已经了解了很长时间。首先,他们认为多态函数应该在类型实例之间保留同构。注意,同构意味着一些一对一对应的想法。显然,同构最初被称为“同构”。然后他们意识到我们现在所说的“同态”,即一些多对一对应的想法,也将被保留。这种保存在范畴论中被称为自然变换。但是,如果我们认真考虑一下,就会意识到同构的保存是完全不令人满意的。类型和A '我们提到的是完全任意的。如果我们选择作为一个'和一个'为一个,我们应该得到相同的属性。那么,为什么不对称概念“多对一对应”在形成对称性质时起着作用呢?因此,雷诺兹迈出了从同构到逻辑关系(这是多对多对应关系)的概括的重要一步。这种概括的全部影响尚未完全理解。但是潜在的直觉是相当清楚的。
这里还有另一种微妙之处。尽管类型变量的实例化可以任意变化,但常量类型应保持固定。因此,当我们为具有变量类型和常量类型的类型表达式制定关系对应关系时,无论类型变量出现在何处,选择的关系都应使用;常量类型K出现于何处,则应使用恒等式I K。例如,对于类型的关系表达式吨× 我Ñ 吨→ 我Ñ 吨× 吨将是- [R × 我本人Ñ 吨 → 我本人。因此,如果f是这种类型的函数,则应将一对(x,n)和一个相关( x ',n)映射到某个对(m,x)和相关(m, x ')。请注意,我们必须通过在两种情况下为常量类型放置相同的值来测试函数,并且保证在输出中为常量类型获取相同的值。因此,在为类型表达式建立关系对应关系时,我们应确保通过插入身份关系(表示那些类型将是一致的想法)来获得身份关系,即。这是至关重要的身份扩展 属性。
此外,试图标识具有相同扩展行为的功能,从而导致等价关系也很诱人。如果我们排除“未定义”函数,则该关系是局部的,即对于某些格式正确的输入“循环”的函数。
PER模型是对此的概括。
看这些模型的另一种方式是同伦类型理论的简单集合模型的(非常)特殊情况。在该框架中,类型被解释为(的一般化),具有关系的集合以及这些关系之间的关系等。在最低层次上,我们仅具有PER模型。
最后,建设性数学领域出现了相关概念的出现,特别是Bishop的集合论涉及通过给出元素和明确的相等关系来描述集合,该关系必须是等价的。很自然地期望一些构造数学原理会进入类型理论。