OCaml 签名函子

Sas*_*dhi 3 ocaml functor

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

module type X = functor (A : ModuleA) -> I with type t := A.t
Run Code Online (Sandbox Code Playgroud)

我正在尝试创建一个类似的函子Y,它也接受A : Module A但返回I. 我正在尝试类似的东西:

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

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

谢谢!

编辑:

我想我的问题是:为什么函子对于模块和模块类型的行为方式不同?

X上面的函子返回一个模块类型(或者至少我是这样读那个表达式的)。如果允许这个表达式,那么为什么 OCaml 禁止扩展生成的模块类型?

kne*_*kne 5

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

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

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

编辑:

如果你已经有一个模块XX类型X(一个实例),你可以做

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

  • @PatJ:是的,但是当谈到有用性时,这个类比就不成立了。函子类型是依赖类型。有一种方法可以在不实际执行应用程序的情况下获取函子应用程序的输出类型,这将很有用。 (4认同)