第 12 章 語言擴展

6 恢復模組的類型

(在 OCaml 3.12 中引入)

module-type::= ...
 moduletypeofmodule-expr

結構 module type of module-expr 會展開為模組表達式 module-expr 推斷出的模組類型(簽名或函子類型)。為了使這個模組類型在許多情況下可重複使用,它故意不被加強:抽象類型和資料類型與原始模組的類型沒有明確的關聯。基於同樣的原因,推斷類型中的模組別名也會被展開。

一個典型的用法,與簽名層級的 include 結構結合使用,是擴展現有結構的簽名。在這種情況下,人們希望保持類型與原始模組中的類型相等。這可以使用以下慣用語來完成。

module type MYHASH = sig include module type of struct include Hashtbl end val replace: ('a, 'b) t -> 'a -> 'b -> unit end

簽名 MYHASH 然後包含模組 Hashtbl 簽名的所有欄位(具有加強的類型定義),加上新欄位 replace。可以通過再次使用 include 結構來輕鬆獲得此簽名的實作,但這次是在結構層級

module MyHash : MYHASH = struct include Hashtbl let replace t k v = remove t k; add t k v end

另一個可以方便地使用不加強的情況,是為現有模組提供替代實作。

module MySet : module type of Set = structend

此慣用語保證 Myset 與 Set 相容,但允許它在內部以不同的方式表示集合。