OCaml签名函数

时间:2018-02-27 11:41:35

标签: ocaml functor

我想在OCaml中扩展一个仿函数。 例如,假设以下仿函数X

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

我正在尝试创建一个类似的仿函数Y,它也接受A : Module A但返回I的扩展版本。 我正在尝试类似的事情:

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

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

谢谢!

编辑:

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

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

1 个答案:

答案 0 :(得分:4)

不幸的是,据我所知,这是不可能的。你必须要做

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

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

编辑:

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

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