2012-04-22 41 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