Условный псевдоним модуля

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

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

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

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

2 ответа

Решение

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

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 ...
Другие вопросы по тегам