假设我们要扩展现有的模块,例如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
通过这样定义我们自己的签名,我们排除了List
的签名,因此我们模块的结构现在不包含任何原始的List
方法。
现在,如果不是我自己创建的模块( List
,那么我们可以单独定义签名并将其包括在我们的模块签名中正在扩展。
# module List : sig
include MY_LIST
val addOne : int -> int
end = struct
include MyList
let addOne x = x + 1
end;;
但是当我们使用List
之类的东西或其他一些我们使用的第三方模块时,有没有办法扩展它并包含我们自己的签名?
是否可以这样做,如果没有,是否存在通常用于实现类似行为的变通方法/是否有规范的方式来处理此类情况?
答案 0 :(得分:5)
在这些情况下有module type of
:
module List: sig
include module type of List
val more: unit
end = struct
include List
let more = ()
end