Skip to content

和类型

Sum type · Variant type

其值从若干带标签分支中选择一个的类型。

条目类型
定义

形式陈述

给定类型 A,B,和类型 A+B 有两个带标签的引入构造;相应的类型判断为:

Γt:AΓinl(t):A+B,Γt:BΓinr(t):A+B.

消去通过分支分析完成:

Γt:A+BΓ,x:Au:CΓ,y:Bv:CΓcase t of inlxuinryv:C.

计算时根据标签选择对应分支。标签使两侧即使底层表示相同也能被可靠区分。

直觉

和类型表达“这里有一份 A,或者有一份 B,并且值自己携带证据说明是哪一种”。标签是定义的关键:没有标签的集合并集在两侧重叠时无法知道应采用哪个分支的处理逻辑。使用和类型必须覆盖所有可能标签,因此模式匹配把运行时分支与静态穷尽性检查结合起来。它不是把两种类型的字段都放在一起,而是一次只选择一个构造器。

例子与边界

和类型 A+B 在运行时公开标签,使用者可模式匹配并知道当前是哪一分支;存在类型把某个见证类型隐藏在包内,只暴露满足接口的操作。二者都能封装异构值,但一个暴露有限选择,一个刻意抽象具体表示。

可选值可定义为 Option(A)=1+ANone 使用单位类型一侧,Some(a) 使用 A 一侧。除法结果也可表示为 Error+Q,调用者通过 case 明确处理除零与正常商。

边界是未经标记的“联合内存”:若只存一段比特而不记录当前分支,读取者可能用错误类型解释数据。另一个常见错误是漏掉一个模式分支;类型规则要求两个分支都产生同一结果类型 C,否则整个 case 无法定型。

推论与应用

和类型是枚举、变体、错误返回和抽象语法构造器的基础。异常语义可显式化为正常结果与错误的和;有限构造子的选择、字段积与可选递归如何统一成代数数据类型,由汇总页集中说明,本页保留二选一的引入、消去与标签边界。

Curry–Howard 对应下,A+B 对应析取 AB:证明必须说明成立的是哪一侧,而使用该证明需要分别处理两种情况。它与积类型构成类型层面的“选择”与“并有”。

参考资料
  • Benjamin C. Pierce, Types and Programming Languages, MIT Press, 2002,Ch. 11, variants and sums。
  • Robert Harper, Practical Foundations for Programming Languages, 2nd ed., Cambridge University Press, 2016,Ch. 12, sum types。
关系图谱13 个相邻概念 · 2 类关系

拖动节点调整位置。

显示关系

显示:依赖

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

并列辨析