类型构造函数“...”在使用第一个 class 模块时会脱离其作用域

The type constructor "..." would escape its scope when using first class modules

给定一个简单的工厂:

module type Factory  = sig type t val create : unit -> t end
module FactoryImpl : Factory = struct 
   type t = string
   let create: unit -> t = fun ()  -> "aaa" 
end 
let factory: (module Factory) = (module FactoryImpl)
let f = let module F = (val factory) in F.create ()

编译器抱怨:

This has type:
F.t
But somewhere wanted:
F.t
The type constructor F.t would escape its scope

我对 OCaml 模块很陌生,不知道如何告诉编译器 fFactory.t

类型

这里的问题是 F.create () 产生一个 F.t 类型的值,所以 f 应该有 F.t 类型,但这是不可能的,因为 F 未绑定在绑定 F.

let module 之外

如果将 F 的范围扩展为全局,程序将键入检查:

module type Factory = sig
  type t
  val create : unit -> t
end

module FactoryImpl : Factory = struct
  type t = string
  let create: unit -> t = fun () -> "aaa"
end

let factory: (module Factory) = (module FactoryImpl)

module F = (val factory)

let f = F.create ()

请注意 Factory.t 不是有效类型,因为没有模块绑定到名称 Factory。模块和模块类型位于不同的命名空间中。