编译单元连接了模块系统和分离编译系统。一个编译单元由两部分组成:一个接口和一个实现。接口包含一系列规范,就像 sig … end 签名表达式的内部一样。实现包含一系列定义和表达式,就像 struct … end 模块表达式的内部一样。一个编译单元也有一个名称 单元名,它派生自包含接口和实现的文件的名称(有关详细信息,请参见第 13 章)。一个编译单元的行为大致相当于模块定义
一个编译单元可以通过它们的名称引用其他编译单元,就像它们是常规模块一样。例如,如果 U 是一个定义了类型 t 的编译单元,则其他编译单元可以以 U.t 的名称引用该类型;它们还可以将 U 作为一个整体结构来引用。除了其他编译单元的名称外,单元接口或单元实现不得有任何其他自由变量。换句话说,接口或实现的类型检查和编译在初始环境中进行
其中 名称1 … 名称n 是搜索路径中可用的其他编译单元的名称(有关详细信息,请参见第 13 章),而 规范1 … 规范n 是它们各自的接口。