代码之家  ›  专栏  ›  技术社区  ›  Nick Zuber

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

  •  2
  • Nick Zuber  · 技术社区  · 6 年前

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

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

    # 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
    

    通过这样定义我们自己的签名,我们排除了 列表 的签名,因此我们模块的结构现在不包含任何原始的 列表 方法。

    现在,如果这个 不是 列表 但是我个人创建的一个模块,然后我们可以单独定义签名,并将其包含在我们正在扩展的模块的签名中。

    # module List : sig
        include MY_LIST
        val addOne : int -> int
      end = struct
        include MyList
        let addOne x = x + 1
      end;;
    

    但是当我们有 列表 ,或者我们正在使用的其他第三方模块,是否有方法扩展它 包括我们自己的签名?

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

    1 回复  |  直到 6 年前
        1
  •  5
  •   octachron    6 年前

    module type of 对于这些情况:

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