Aniket Schneider
Aniket Schneider

Reputation: 944

Conditional module aliasing

For a class project I am writing a program that evaluates the performance of different implementations of the same abstract data structure. Since I am using identical code to test each of them, I would like to be able to set a module alias depending on user input and just run that module through the testing code.

In other words, I want something like:

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

Is there a way I can make this work, or am I going about this all wrong?

Upvotes: 12

Views: 555

Answers (2)

ansiwen
ansiwen

Reputation: 1241

As a follow-up to @Andreas, at least in recent ocaml versions you can also write:

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

Upvotes: 1

Andreas Rossberg
Andreas Rossberg

Reputation: 36098

There are no conditionals on the module level, but you can use first-class modules for this:

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

Upvotes: 14

Related Questions