类型系统与程序语言——子类型和递归类型
子类型和递归类型
子类型 Subtyping
定义
如果没有子类型,那么
添加一个超类
添加记录(Record)的额外规则。
性质
因为添加了新的规则,需要重新论证类型安全性。即 Safety = Progress + Preservation。
证明过程与没有子类型的有类型 Lambda 表达式类似,但是多出来几个情况。
对于 Preservation,请考虑每个 evaluation rule 和对应的 typing rule。
对于 Progress,请考虑每个 term 的形式以及对应的 evaluation rule。
事实上,terms,evaluation rules,typing rules 的关系非常紧密。
Top 类型和 Bot 类型
在子类型系统中添加 Top 类型和 Bot 类型分别作为所有类型的父类和子类。Bot 类型没有任何成员。Top 类型在实际语言中比较常见,但 Bot 类型将需要在未来得到更充分的叙述。
其他特性
类型转换
在子类型系统中,类型注解(ascription)升级为类型转换(casting),分为类型上升(up-casting)和类型下降(down-casting)。其中类型上升是将子类元素委派为父类,类型下降反之。
类型上升没有什么不同,而类型下降允许将类型检查器无法静态推理出来的类型指派给表达式,但有破坏语言安全性的风险。
错误的类型转换,会造成无法预料的结果。采取在静态类型检查中相信程序员的类型指派,而在动态程序运行时检验类型的措施,可能需要两套类型系统。
变体 Variants
链表
引用
需要
一个实例是
数组
数组是一串引用
交类型和并类型
这表明,如果有函数是
同理有并类型
算法式定义
虽然已经定义了关于子类型系统的一系列规则,但是这些规则还无法被直接实现,原因在于这些规则还有一些小漏洞。
比如:
我们将更新规则,因为这些规则将被用于类型检查算法,称为算法子类型。
如果通过算法能得出
算法子类型(algorithmic subtyping)
我们首先将
可以证明这些规则是安全且完备的(soundness and completeness):
再给出一个算法,该算法是有穷的(termination)。
算法类型(algorithmic typing)
通过改写规则的应用情况,使类型检查成为可能。
同样有安全性和完备性,表明算法类型关系和前述的类型关系是一致的:
证明需要对照两种类型关系的叙述,并归纳证明。
递归类型 Recursive Types
用变体类型表示的一个链表
为了将类型名单独放在左侧,递归过程放在右侧,现在引入递归符号
递归类型举例
形式化定义
添加一对函数
它们的结果是一个关于类型的函数,可以将递归类型的展开形式和折叠形式作转换。
元理论
现有全集
给出三个定义,
is F-closed if is F-consistent if is a fixed point if
用推理规则表示函数的输入集合和输出集合,比如函数
命题:F-closed 的集合的交集是
多态
如果一个类型系统允许一段代码被不同的类型使用,那么这种类型系统被称为多态系统。
类型重构
前面的类型检查方法需要为每个 term 指定具体的类型。类型重构可以推断出一个大致的类型。
- 声明一个从类型变量到类型的映射
- 应用这个映射于一个具体类
得到
类型重构方法可以找到类型,不必显式写出
定义:令
类型的约束求解
定义
多态 Lambda 表达式
将类型作为参数,得到多态 Lambda 表达式。类似 C++ 里的模版。
本文作者:violeshnv
本文链接:https://www.cnblogs.com/violeshnv/p/16831708.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律