OCaml签名函子

OCaml签名函子,ocaml,functor,Ocaml,Functor,我试图在OCaml中扩展一个函子。 例如,假设以下函子X: 我试图创建一个类似的functor Y,它也接受:模块a,但返回I的扩展版本。 我正在尝试类似于: module type Y = functor (A : ModuleA) -> sig include X(A) val blah : A.t -> int end 但我在这上面有个语法错误。 我试图用更多的函数来扩展从X得到的签名。这在OCaml中可能吗?我做错了什么 谢谢 编辑: 我想我的问题是

我试图在OCaml中扩展一个函子。 例如,假设以下函子X:

我试图创建一个类似的functor Y,它也接受:模块a,但返回I的扩展版本。 我正在尝试类似于:

module type Y = functor (A : ModuleA) ->
  sig
    include X(A)
    val blah : A.t -> int
  end
但我在这上面有个语法错误。 我试图用更多的函数来扩展从X得到的签名。这在OCaml中可能吗?我做错了什么

谢谢

编辑:

我想我的问题是:为什么函子对模块和模块类型的行为不一样


上面的函子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

哪个语法错误?这是不可能的,因为X不是函子,而是函子的签名。你不能应用它的原因和你不能应用函数类型的原因是一样的。@PatJ:是的,但是当谈到有用性时,类比就失效了。函子类型是从属类型。如果能够在不实际执行应用程序的情况下获得函子应用程序的输出类型,那将非常有用。我必须承认,但是任何使用函子的人都会在某处声明返回类型。谢谢@kne。我实施了你的第一个建议。在X和Y中维护重复的代码很烦人,但我可以接受:
module type Y = functor (A : ModuleA) ->
  sig
    include module type of XX(A)
    val blah : A.t -> int
  end