Given a simple 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 ()
Compiler complains:
This has type:
F.t
But somewhere wanted:
F.t
The type constructor F.t would escape its scope
I am quite new to OCaml modules and not sure how to tell compiler that f is of type Factory.t
The problem here is that F.create () produces a value of type F.t, so f should have type F.t, but that is impossible because F is not bound outside the let module that binds F.
If you extend the scope of F to be global, the program will type check:
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 ()
Note that Factory.t is not a valid type, as there is no module bound to the name Factory. Modules and module types are in separate namespaces.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With