类型系统
首先需要明确的一点是,类型系统 不是计算不可分割的组成部分。这一点,最直观的证据是,汇编语言没有类型系统。
然而,说没有类型系统可能不够严谨,因为汇编是有类型的,比如 word 和 double word……但,在设计类型系统这件事上,我们有全部的自由。设计类型系统是一个逻辑上的难题。
最简?
有所谓 “最基本的类型系统” 吗?有。对基本类型上基本运算的检查是最基本的。
那复杂性从何而来?为了便于使用,需要基本类型可以组合成聚合类型,需要基本运算可以组合成复合运算。
复合运算的组合手段有二,使某一运算的结果做后续运算的参数、使某一运算的结果做后续运算的选择条件(if 语句)。if 语句是很独特的,只要使用了 if 语句,就引入了 Union Type。
Union Type
if 语句让函数返回值的类型与输入参数的值(而不是输入参数的类型)。因为输入不确定,所以返回值类型不确定。
宽化转换
向上转换可以隐式进行。
窄化转换
窄化转换一定要对宽类型中的每一种可能分别处理,编译器要强制这一点。
新类型
结构体定义产生 “新的基本类型”,而 Union Type 标记只是一个别名。
泛型和二阶类型
有时候我们需要高阶类型,最典型的应用是容器。容器太普遍了,但容器的类型却是个难点。