TL类型语言的类型序列化
接下来需要描述类型(例如,Type 类型的值)是如何传输(序列化的)的。一般来说,这里没有什么意外:我们有各种元数的类型构造函数(例如,List 是一个元数为 1 的构造函数,而 IntList 是一个元数为 0 的构造函数);如果我们知道每个类型构造函数都被分配了一个 32 位的“名称”,那么就没有其他问题了——Type 类型的值序列化方式与任何其他具有一组不同元数构造函数的递归类型的值完全相同。
如何为类型(更准确地说是类型构造函数)例如 List 或 IntList 分配一个 32 位“名称”?建议使用其所有构造函数名称之和,再加上包含类型名称及其所有参数的字符串的 CRC32 校验值,例如“IntList = Type”或“List X:Type = Type”。这样,List 构造函数的“名称”就是三个字符串“List X:Type = Type”、“cons X:Type hd:X tl:List X = List X”和“nil X:Type = List X”的 CRC32 校验值之和。对于“裸”类型(严格来说,它们是相应“装箱”类型的子类型),情况则更为复杂;需要使用相应构造函数名称的逻辑取反。对于内置的裸类型和装箱类型(例如,int 和 Int),使用伪声明(例如,int ? = Int")。
- 此描述已略显过时,未来可能会更新。特别是,!尚未解释如何处理修饰符。*