module type Comparable = sig
type t
val compare : t -> t-> int
end
限定了模塊類型。在一個接口(例如.mli
文件)中,它承諾實現(.ml
)包含相同的模塊類型定義。
module Comparable : sig
type t
val compare : t -> t-> int
end
在接口中承諾提供相同類型的模塊。它相當於
module Comparable : Comparable
(假設模塊類型確實定義了)。它聲明對應的.ml
包含名爲Comparable
的子模塊。
你應該把哪兩個放在你的.mli
取決於你想要做出什麼承諾。兩者都有其用途。
模塊類型定義通常在接口中找到,如果它們需要作爲函子的參數。事實上,您的模塊類型Comparable
等於Map.OrderedType
,函數的參數類型爲Map.Make
。
上述子模塊的一個用例是提供了,它可以用作函子的參數。例如,一個.mli
看起來是這樣的:
type stuff = ...
val fancy : ... (* some operations on stuff *)
module Comparable : Comparable with type t=stuff
在這種形式,它將使類型stuff
可用作地圖的主要類型。這就是說,如果你的例子是完整的現實世界的例子,那麼我懷疑你想要的是模塊類型定義,而不是子模塊:子模塊不會很有用;你沒有任何操作來構造t
類型的任何東西。
來源
2017-03-11 17:59:38
kne