“沿用递归类型的equi recursive解释:类型与展开一层的结果视为相同。问题是,两份有限写法是否描述同一棵可能无限的类型树?一棵树的同一模式可以每层重复,也可以每两层重复,文字长度不同…”
形式陈述
在类型判断中,递归类型用类型绑定器
连接;在 equi-recursive 系统中二者直接按类型等式识别。类型等价是否可判定取决于具体系统。递归类型本身只给出类型方程及其折叠关系;严格正性、最小生成与归纳原则是归纳类型增加的结构,不应反过来作为所有 recursive type 的定义。
直觉
普通有限类型只能描述固定深度的结构,递归类型把“剩余部分仍是同一种结构”写进类型本身。列表不是某个最大长度的嵌套积,而是“空,或一个元素加另一条列表”的方程。fold 和 unfold 像在抽象类型与展开一层的表示之间开关,iso-recursive 语义让每次展开都在程序中可见。方程可以描述良基数据、无限结构或负位置递归;选择最小/最大解释以及允许哪些出现位置,需要另行指定。
例子与边界
列表可写为
空表对应 fold(inl(unit)),非空表对应 fold(inr(a,xs));每次模式匹配先 unfold 一层。二叉树可类似写成
边界是方程
推论与应用
递归类型是链表、树、流、对象自引用和递归模块的核心表示。与和类型、积类型组合可得到代数数据类型的常见方程;这项汇总不改变 fold/unfold 的递归类型核心。
在编译器中,显式 fold/unfold 帮助证明表示安全。证明助理通常改用严格正、最小生成的归纳类型,并由消去子与归纳原理消费有限构造数据;无限流等对象则需要最大不动点与共归纳观察。类型方程、归纳生成和共归纳生产性是相邻层次,不可仅凭同一个
对闭合、可观察的equi-recursive类型,正则递归类型等价把词法绑定压成有限构造图,交互模拟对集或有限区分路径;单周期与双周期可以等价,纯别名环则先按该接口拒绝。若问题改为一个递归接口能否替代另一个,递归结构子类型判定返回有方向的闭合义务,函数参数处必须交换两端。
参考资料
- 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。