2012-03-23 46 views
5

什麼是創造OCaml中的界面以傳統的方式多發的實現?這可能與通過創建一個接口文件foo.mli和實現文件foo.ml單個實現一個接口,但你怎麼能在同一個界面中創建多個實現?接口與OCaml中

回答

5

如果你要擁有相同的簽名多個實現,定義你的簽名編譯單元內,而不是作爲一個編譯單元,以及(如果需要)同樣的模塊。還有的是,在標準庫的例子:OrderedType簽名,描述一個類型和該類型的比較功能模塊:

module type OrderedType = sig 
    type t 
    val compare : t -> t -> int 
end 

此簽名定義都set.mlimap.mli(可以參考它作爲Set.OrderedTypeMap.OrderedType,或者甚至自己寫出來:簽名是結構化的)。標準庫中有幾個編譯單元具有此簽名(String,Nativeint等)。您也可以定義自己的模塊,並且你不需要定義模塊在何時做什麼特別的:只要有一個名爲t類型和一個叫t -> t -> int類型的compare值,該模塊具有簽名。在標準庫中有一個稍微詳細的例子:Set.Make函子構建了一個模塊,其簽名爲OrderedType,因此您可以通過這種方式構建集合。

(* All four modules passed as arguments to Set.Make have the signature Set.OrderedType *) 
module IntSet = Set.Make(module type t = int val compare = Pervasives.compare end) 
module StringSet = Set.Make(String) 
module StringSetSet = Set.Make(StringSet) 
module IntSetSet = Set.Make(IntSet) 
9

您必須使用模塊和簽名。一個.ml文件隱含地定義了一個模塊,以及一個.mli其簽名。使用明確的模塊和簽名,您可以將簽名應用於多個不同的模塊。

見在線書籍「開發與應用ocaml的」的this chapter

+0

非常感謝這本書鏈接。這在很多方面都非常有幫助。 – 2012-03-29 04:59:59