OCaml 签名函子

OCaml Signature Functors

我正在尝试扩展 OCaml 中的仿函数。 例如,假设以下函子 X:

module type X = functor (A : ModuleA) -> I with type t := A.t

我正在尝试创建一个类似的仿函数 Y,它也接受 A : Module A 但 returns 是 I 的扩展版本。 我正在尝试类似的东西:

module type Y = functor (A : ModuleA) ->
  sig
    include X(A)
    val blah : A.t -> int
  end

但是我得到了一个语法错误。 我正在尝试使用更多功能扩展 X 的结果签名。这在 OCaml 中可能吗?我做错了什么?

谢谢!

编辑:

我想我的问题是:为什么仿函数对模块和模块类型的行为不同?

模块类型 returns 上方的仿函数 X(或者至少我是这样理解该表达式的)。如果允许此表达式,那么为什么 OCaml 禁止扩展生成的模块类型?

不幸的是,据我所知这是不可能的。你将不得不做

module type Y = functor (A : ModuleA) ->
  sig
    include I with type t := A.t
    val blah : A.t -> int
  end

希望其他人可以详细说明为什么您尝试使用的功能未实现。可能有一个很好的理由。

编辑:

如果您已经有 X 类型的模块 XX(一个实例),您可以执行

module type Y = functor (A : ModuleA) ->
  sig
    include module type of XX(A)
    val blah : A.t -> int
  end