“一般递归类型中的 只在类型与其一层展开之间转换。它们本身不说明居民是否由有限构造器生成,也不自动提供归纳假设。反过来,归纳类型的构造器往往由实现编译成标签和字段,但其理论含义是引入规则及最小…”
形式陈述 ​
在类型判断中,递归类型用类型绑定器
连接;在 equi-recursive 系统中二者直接按类型等式识别。类型等价是否可判定取决于具体系统。递归类型本身只给出类型方程及其折叠关系;严格正性、最小生成与归纳原则是归纳类型增加的结构,不应反过来作为所有 recursive type 的定义。
直觉
普通有限类型只能描述固定深度的结构,递归类型把“剩余部分仍是同一种结构”写进类型本身。列表不是某个最大长度的嵌套积,而是“空,或一个元素加另一条列表”的方程。fold 和 unfold 像在抽象类型与展开一层的表示之间开关,iso-recursive 语义让每次展开都在程序中可见。方程可以描述良基数据、无限结构或负位置递归;选择最小/最大解释以及允许哪些出现位置,需要另行指定。
例子与边界
列表可写为
空表对应 fold(inl(unit)),非空表对应 fold(inr(a,xs));每次模式匹配先 unfold 一层。二叉树可类似写成
边界是方程
推论与应用
递归类型是链表、树、流、对象自引用和递归模块的核心表示。与和类型、积类型组合可得到代数数据类型的常见方程;这项汇总不改变 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。