大多数编程语言都有表达式或者对象的类型的概念。类型有几个重要目的:

  1. 类型提供了很多操作的隐式上下文,开发者不需要显式表达。比如在 C 中,如果 a or b 是整数 a + b 表示整数,或者 a or b 是浮点数a + b 是浮点数。类似的 Pascal new p ,p 是指针,将会分配 p 指向类型的确定大小的内存,开发者不需要指定大小。在 C++ ,Java 和 C# 中 new new_type() 不仅分配内存,还调用类型绑定的初始化操作。
  2. 在语义上,类型限制了有效操作集合。有了类型,编译器可以检查类型错误,否则只能由开发者自己确定。
  3. 如果在源代码中明确指定类型(不是所有语言都需要),可以让代码更容易读。实际上,还可以作为风格文档,编译器检查(事实上,这样可能会是代码更难写)
  4. 如果类型在编译期就知道(或者程序显式指定类型或者编译器可以推断出来),还可以用来推动性能优化。

7.1 更多的关注类型的意义和目的。提供了一些基本定义,介绍了多态性和正交性的概念。7.2 更关注类型检查;尤其是讨论 type equivalence(什么时候可以说两个类型相同?),type compatibility(什么时候我们可以在给定上下文使用给定类型的值?), type inference(我们如何推断表达式类型?)

作为一个多态性和正交性推断的例子,7.2.4 总结了 ML 类型系统,在很大程度上结合了汇编的效率和早期编译错误检查以及解释器的便利性。我们继续在 7.3 学习多态,尤其是,强调范型,范型允许一段代码对类型进行参数化。最后,7.4 我们讨论如何对比两个类型,或者互相赋值。在第 8 章,我们将考虑一些重要的复合类型: records,arrays, strings, sets, pointers, lists, and files.