假设我们想要扩展现有的模块,比如
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;;
但是当我们有
列表
,或者我们正在使用的其他第三方模块,是否有方法扩展它
和
包括我们自己的签名?
是否有可能做到这一点?如果没有,是否有一种常用的解决方法来实现类似的行为/是否有一种规范的方法来处理这些类型的情况?