类型构造函数“...”在使用第一个 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 模块很陌生,不知道如何告诉编译器 f
是 Factory.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
。模块和模块类型位于不同的命名空间中。
给定一个简单的工厂:
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 模块很陌生,不知道如何告诉编译器 f
是 Factory.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
。模块和模块类型位于不同的命名空间中。