知识卡片

类型的正式定义与类型生成器

普通读书笔记卡

内容

类型的精确定义是:一个已命名的、有限的值集合——某种特定类型的全部可能取值(如 所有可能的整数、所有可能的供应商编号)。”已命名”意味着不同名字的类型是不同的 类型;”有限”是因为计算机本身就是有限的;每个值总是且只属于一种类型(除非引入 类型继承,本书不讨论),因此类型按定义是互斥的。定义一个新类型至少要包含六项 工作:起名字、定义构成该类型的合法值集合、定义隐藏的物理表示(属于实现层不属于 模型层)、定义选择器运算符(用于选取/指定该类型的某个具体取值)、定义应用于该 类型的运算符(至少包括赋值”:=“、相等比较”=“和THE_运算符)、为每个返回结果的 运算符定义结果类型。任何类型的值和变量都只能用与该类型绑定的运算符来操作——比如 整数有算术运算符但没有字符串连接运算符,供应商编号即使物理上用CHAR表示,也不能 直接套用字符串连接运算符,除非专门为该类型定义了连接运算这个操作。这种类型-运算符 绑定关系还引出了类型生成器(type generator)的概念:像RELATION、TUPLE这类特殊 运算符,输入不是值而是类型定义、返回的也不是值而是一个新类型,且在编译期而非 运行期被调用——RELATION{SNO CHAR,...}就是调用RELATION类型生成器构造出的一个 生成式类型。另外,选择器调用是”字面值”这个更常见概念的一般化:所有字面值都是 选择器调用,但只有当选择器调用的全部实参本身也是字面值时,这次调用才算是字面值 (例如POINT(1.0,2.5)是字面值,POINT(X,Y)只是选择器调用)。

参考来源

- 位置:《SQL与关系数据库理论——如何编写健壮的SQL代码》第2章"类型和域"2.4节 "类型是什么"(源文件:OEBPS/text00022.html) - 结论依据:原文明确"类型……它就是已命名的、有限的值集合……在定义一个新类型时至少 要包括下述所有工作:1.为类型定义名称……4.为选择或者指定该类型的取值定义一个 选择器运算符……根据定义,某个确定的类型的值和变量只能使用与该类型相关的运算符 进行运算""所有的字面值都是选择器调用,但并非所有的选择器调用都是字面值"。 - 原始内容:类型……它就是已命名的、有限的值集合……根据定义,某个确定的类型的值 和变量只能使用与该类型相关的运算符进行运算……所有的字面值都是选择器调用,但 并非所有的选择器调用都是字面值。