2012-04-22 22 views
10

對於一個類項目,我正在編寫一個程序,用於評估相同抽象數據結構的不同實現的性能。由於我使用相同的代碼來測試每個代碼,因此我希望能夠根據用戶輸入設置模塊別名,並通過測試代碼運行該模塊。有條件的模塊別名

換句話說,我想是這樣的:

let module M = 
    if model = "tree" then TreeModel else 
    if model = "hash" then HashModel else 
    ListModel 
in ... 

有沒有一種方法可以讓我做這個工作,或者我要對所有這一切錯了嗎?

回答

11

上有模塊級沒有條件語句,但你可以用一流的模塊是:

let m = match model with 
    | "tree" -> (module TreeModel : MODEL) 
    | "hash" -> (module HashModel : MODEL) 
    | "list" -> (module ListModel : MODEL) 
in let module M = (val m : MODEL) 
in ... 
+0

謝謝,這正是我一直在尋找的! – 2012-04-22 22:22:05

0

作爲後續@Andreas,至少在最近ocaml的版本中,你也可以寫:

let (module M : MODEL) = match model with 
    | "tree" -> (module TreeModel : MODEL) 
    | "hash" -> (module HashModel : MODEL) 
    | "list" -> (module ListModel : MODEL) 
in ... 
+0

和這種形式,你不必在所有匹配分支中寫入模塊類型信息:'(module M:MODEL)'就足夠了,並且會傳播。 – lavi 2017-12-06 09:14:58