Условное сглаживание модулей

Для проекта класса я пишу программу, которая оценивает производительность различных реализаций той же абстрактной структуры данных. Поскольку я использую идентичный код для проверки каждого из них, я хотел бы иметь возможность устанавливать псевдоним модуля в зависимости от пользовательского ввода и просто запускать этот модуль через тестовый код.

Другими словами, я хочу что-то вроде:

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

Есть ли способ, которым я могу выполнить эту работу, или я собираюсь сделать все это неправильно?

Ответ 1

На уровне модуля нет условных выражений, но для этого вы можете использовать первоклассные модули:

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

Ответ 2

Как продолжение @Andreas, по крайней мере в последних версиях ocaml вы также можете написать:

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