第 12 章 语言扩展

15 生成式函子

(OCaml 4.02 中引入)

模块表达式::= ...
 functor()->模块表达式
 模块表达式()
 
定义::= ...
 module模块名 { (模块名:模块类型) ∣ () } [ :模块类型 ]  =模块表达式
 
模块类型::= ...
  [functor] ()->模块类型
 
规范::= ...
 module模块名 { (模块名:模块类型) ∣ () } :模块类型
 

生成式函子接受一个单元 () 参数。为了使用它,必须将其应用于此单元参数,以确保函子结果中的所有类型组件都以生成方式工作,它们与通过相同函子的其他应用获得的类型不同。这等效于接受一个 sig end 签名的参数,并且始终应用于 struct end,但不是应用于某个已定义的模块(在后一种情况下,对同一模块应用两次将返回相同的类型)。

作为这种生成性的副作用,允许在生成式函子的主体中解包一级模块。