Skip to content

定义Definition

类型判断

施工中 · 内容逐步修订

Typing judgment

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

形式陈述 ​

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

Γ⊢t:T,

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

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

x:T∈ΓΓ⊢x:TΓ,x:A⊢t:BΓ⊢λx:A.t:A→BΓ⊢t1:A→BΓ⊢t2:AΓ⊢t1t2:B.

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

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

直觉

上下文记录当前可用的静态假设,推导树给出类型结论的证据。判断中的冒号连接“项”与“类型”,横杠连接“前提判断”与“结论判断”;二者不是程序里的赋值。尤其是 Γ,x:A 只告诉我们 x 可按 A 使用,并没有替 x 提供运行时数值。

类型检查可以看成受约束的证明搜索:若目标项是应用 fx,最后一步必须解释一次调用,因此先寻找函数的箭头类型,再检查实参是否匹配其定义域。在这里列出的简单规则中,语法外形帮助选择最后规则;有转换或子类型规则时,最后一步未必如此唯一。

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

信息流类型系统把上下文具体化为公开/秘密标签,并用pc记录控制选择。秘密条件中写公开常量也可能泄漏,因此赋值规则同时检查右端和pc;两支恰好写同一常量却仍被拒绝,则展示这种语法证明的保守性。

例子与边界

在 Γ=x:Z,f:Z→B 中,可直接构造

f:Z→B∈ΓΓ⊢f:Z→Bx:Z∈ΓΓ⊢x:ZΓ⊢fx:B.

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

同一上下文不能推出 xf 的类型:应用规则要求左项 x 有箭头类型,而唯一变量声明给它 Z。这不是运行后发现整数不能调用,而是在构造推导时所需前提无法成立。反过来,fx 的结果类型为布尔,并不告诉我们结果究竟是 true 还是 false;那需要函数的实现与动态语义。

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

“在某上下文中良类型”不保证可独立运行。x+1 在 x: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。
关系图谱72 个相邻概念 · 1 类关系

拖动节点调整位置。

显示关系

显示:依赖

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