Skip to content

递归类型

Recursive type

通过类型方程把类型变量递归绑定到包含自身的类型。

条目类型
定义

形式陈述

类型判断中,递归类型用类型绑定器 μX.T 表示类型方程 XT 的一个解,其中 T 可含被绑定的类型变量 X。在 iso-recursive 系统中,μX.TT[μX.T/X] 由显式构造

fold:T[μX.T/X]μX.T,unfold:μX.TT[μX.T/X]

连接;在 equi-recursive 系统中二者直接按类型等式识别。类型等价是否可判定取决于具体系统。递归类型本身只给出类型方程及其折叠关系;严格正性、最小生成与归纳原则是归纳类型增加的结构,不应反过来作为所有 recursive type 的定义。

直觉

普通有限类型只能描述固定深度的结构,递归类型把“剩余部分仍是同一种结构”写进类型本身。列表不是某个最大长度的嵌套积,而是“空,或一个元素加另一条列表”的方程。foldunfold 像在抽象类型与展开一层的表示之间开关,iso-recursive 语义让每次展开都在程序中可见。方程可以描述良基数据、无限结构或负位置递归;选择最小/最大解释以及允许哪些出现位置,需要另行指定。

例子与边界

列表可写为

List(A)=μX.1+A×X.

空表对应 fold(inl(unit)),非空表对应 fold(inr(a,xs));每次模式匹配先 unfold 一层。二叉树可类似写成 μX.1+A×X×X

边界是方程 X=X,它没有提供任何可观察构造,不能凭符号自动得到有用数据。某些演算允许 μX.XA 一类负位置递归,并可能由此给自应用定型、破坏强正规化;用于良基数据的严格正限制及反例分析见归纳类型,本页不把该限制强加给所有递归方程。

推论与应用

递归类型是链表、树、流、对象自引用和递归模块的核心表示。与和类型积类型组合可得到代数数据类型的常见方程;这项汇总不改变 fold/unfold 的递归类型核心。

在编译器中,显式 fold/unfold 帮助证明表示安全。证明助理通常改用严格正、最小生成的归纳类型,并由消去子与归纳原理消费有限构造数据;无限流等对象则需要最大不动点与共归纳观察。类型方程、归纳生成和共归纳生产性是相邻层次,不可仅凭同一个 μ 记号互换。

参考资料
  • Benjamin C. Pierce, Types and Programming Languages, MIT Press, 2002,Chs. 20–21, iso-recursive and equi-recursive types。
  • Robert Harper, Practical Foundations for Programming Languages, 2nd ed., Cambridge University Press, 2016,Ch. 16, recursive types。
关系图谱10 个相邻概念 · 1 类关系

拖动节点调整位置。

显示关系

显示:依赖

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