Ocaml 如何在扩展模块中包含签名?

Ocaml 如何在扩展模块中包含签名?,ocaml,Ocaml,假设我们想要扩展一个现有的模块,比如List 我们通常只包含我们想要扩展的模块,然后将新方法添加到其结构中: # module List = struct include List let addOne x = x + 1 end;; 这给了我们一个签名: module List : sig val length : 'a list -> int val compare_lengths : 'a list -> 'b list -> i

假设我们想要扩展一个现有的模块,比如
List

我们通常只
包含我们想要扩展的模块,然后将新方法添加到其结构中:

# module List = struct
    include List
    let addOne x = x + 1
  end;;
这给了我们一个签名:

module List :
  sig
    val length : 'a list -> int
    val compare_lengths : 'a list -> 'b list -> int
    val compare_length_with : 'a list -> int -> int
    :
    val addOne : int -> int
  end
现在,如果我还想显式扩展模块的签名,我会尝试执行以下操作:

# module List : sig
    val addOne : int -> int
  end = struct
    include List
    let addOne x = x + 1
  end;;
但现在我们看到我们的签名变成:

module List :
  sig
    val addOne : int -> int
  end
通过这样定义我们自己的签名,我们排除了
列表
的签名,因此我们模块的结构现在不包括任何原始的
列表
方法

现在,如果这不是
List
,而是我个人创建的模块,那么我们可以单独定义签名,并将其包含在我们要扩展的模块的签名中

# module List : sig
    include MY_LIST
    val addOne : int -> int
  end = struct
    include MyList
    let addOne x = x + 1
  end;;
但是,当我们有类似于
列表
,或者我们正在使用的其他第三方模块时,有没有办法扩展它并包含我们自己的签名


是否有可能做到这一点,如果没有,是否有一种常用的解决方法来实现类似的行为/是否有一种规范的方法来处理这些类型的情况?

对于这些情况,有
模块类型的

module List: sig
  include module type of List
  val more: unit
end = struct
  include List
  let more = ()
end