Конструктор типа "..." выходит из области видимости при использовании модулей первого класса

Учитывая простую фабрику:

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, Модули и типы модулей находятся в отдельных пространствах имен.

Другие вопросы по тегам