Module 条件模块别名

Module 条件模块别名,module,ocaml,Module,Ocaml,对于一个类项目,我正在编写一个程序来评估同一抽象数据结构的不同实现的性能。由于我使用相同的代码来测试每个模块,因此我希望能够根据用户输入设置模块别名,并在测试代码中运行该模块 换句话说,我想要的是: let module M = if model = "tree" then TreeModel else if model = "hash" then HashModel else ListModel in ... 有什么办法可以让这一切顺利进行,还是我的做法完全错了?模块级没有条件

对于一个类项目,我正在编写一个程序来评估同一抽象数据结构的不同实现的性能。由于我使用相同的代码来测试每个模块,因此我希望能够根据用户输入设置模块别名,并在测试代码中运行该模块

换句话说,我想要的是:

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

有什么办法可以让这一切顺利进行,还是我的做法完全错了?

模块级没有条件,但您可以使用一流的模块来实现这一点:

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 ...

作为@Andreas的后续版本,至少在最近的ocaml版本中,您还可以编写:

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

谢谢,这正是我想要的!使用此表单,您不必在所有匹配分支中写入模块类型信息:
(模块M:MODEL)
就足够了,并且会传播。这里不需要。我将得到
错误:无法推断此打包模块的签名。
没有类型批注。可能取决于编译器的版本,但对我来说,这是可行的:
let(模块M:MODEL)=将模型与|“tree”->(模块TreeModel)匹配。