Skip to content

类型判断

Typing judgment

由类型规则推导的上下文判断,记录项在给定变量假设下具有的静态类型。

条目类型
定义

形式陈述

类型判断是形式系统中的判断形状,典型写作

Γt:T,

读作“在上下文 Γ 下,项 t 具有类型 T”。判断成立意味着存在一棵有限推导树:根是该判断,每个节点都是某条类型规则的实例,叶子由零前提规则结束。

上下文通常写成有限声明序列 x1:T1,,xn:Tn,并要求变量互异;也可实现为有限映射。它按照词法绑定解释自由变量。以函数演算为例:

x:TΓΓx:TΓ,x:At:BΓλx:A.t:ABΓt1:ABΓt2:AΓt1t2:B.

抽象规则把 x:A 临时加入上下文,只在函数体推导中有效;离开前提后,该假设被解除。若内层再次声明 x,必须按系统约定遮蔽或先 α-换名,不能同时把一次使用解释为两个声明。

类型良构 ΓT type、类型相等 ΓAB、子类型 ΓA<:B 都是不同判断。上下文是否允许交换、弱化、收缩也取决于规则;在线性或其他子结构类型系统中,这些结构性质不能默认成立。

直觉

上下文记录当前可用的静态假设,推导树给出类型结论的证据。类型检查可以看成受约束的证明搜索:从目标判断反向选择规则,再为每个前提构造子推导。

这项证明只使用静态可见信息,不运行所有可能输入。类型系统因而通常是保守近似:可推导项获得保证,一些实际运行安全却无法在当前规则中证明的项仍会被拒绝。

例子与边界

Γ=x:Z,f:ZB 中,可直接构造

f:ZBΓΓf:ZBx:ZΓΓx:ZΓfx:B.

对闭项 λx:Z.x,函数体在临时上下文 x:Z 下定型,抽象规则解除该假设后得到 λx:Z.x:ZZ

上下文 Gamma 支撑函数与实参两个叶判断,应用规则把它们合成为 f x 的布尔类型。

“在某上下文中良类型”不保证可独立运行。x+1x:Z 下可定型,却仍含自由变量;进展定理若针对闭程序,就不能直接应用它。类型判断也不声称项会终止,更不描述运行时值。

声明式规则未必直接给出算法。带完整注解、语法导向的规则常可机械反推;子类型、隐式多态或依赖类型相等会引入搜索与约束求解。双向类型检查通过区分综合与检查,重新组织相同或相近的声明式内容。

推论与应用

类型判断直接作用于语法项与上下文,不依赖某种编译器AST 表示简单类型 λ 演算、System F 和依赖类型理论通过不同规则定义各自的合法项。

元理论通常对类型推导归纳。逆置引理从结论判断恢复最后规则可能提供的前提,替换引理处理 β-步骤,进展与保持定理再把静态推导与动态执行连接起来。Hindley–Milner 推断从无注解项构造判断与主类型;证明助理中的类型检查器则验证证明项对应的判断。

参考资料
  • Benjamin C. Pierce, Types and Programming Languages, MIT Press, 2002, Chapters 8–11。
  • Robert Harper, Practical Foundations for Programming Languages, 2nd ed., Cambridge University Press, 2016, Chapters 4 and 10。
  • Andrew K. Wright and Matthias Felleisen, “A Syntactic Approach to Type Soundness,” Information and Computation 115(1), 1994, pp. 38–94。
关系图谱48 个相邻概念 · 1 类关系

拖动节点调整位置。

显示关系

显示:依赖

  1. 前置三跳
  2. 前置二跳
  3. 前置一跳
  4. 当前条目
  5. 后续一跳
  6. 后续二跳
  7. 后续三跳
文字版关系按与当前条目的最短距离分组