Конструктор типа "..." выходит из области видимости при использовании модулей первого класса
Учитывая простую фабрику:
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
1 ответ
Решение
Проблема здесь в том, что F.create ()
производит значение типа F.t
, так 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
, Модули и типы модулей находятся в отдельных пространствах имен.