ocaml 模块类型中的强制类型 *not* abstract

Mandate type *not* abstract in ocaml module type

我想用 type t 定义一个模块类型。因此,type 的任何实施者都必须选择 type t。有什么方法可以从模块 type 定义中保证这个 type t 不是 是抽象的。所以说我的 mli 文件中有这个定义:

module type TYP = sig
  type t
  val f: t->unit
end
module M:TYP

对于这种模块类型,任何想调用 M.f 的人都会倒霉,因为 type t 是抽象的,所以无法生成它。当然,我可以这样做

module type TYP = sig
  type t
  val f: t->unit
end
module M:TYP with type t=int

但是有什么方法可以 "demand" 使 type t 不是抽象的,以至于任何实施者都必须公开它?

这是不可能的。但是你可以要求用户为你提供一个构造函数,像这样:

module type T : sig
   type t
   val create : unit -> t
   val f : t -> unit
end