给定一个简单的工厂:
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
, so f
应该有类型F.t
,但这是不可能的,因为F
不受约束于外部let module
绑定F
.
如果扩大范围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
。模块和模块类型位于不同的命名空间中。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)