Условное сглаживание модулей
Для проекта класса я пишу программу, которая оценивает производительность различных реализаций той же абстрактной структуры данных. Поскольку я использую идентичный код для проверки каждого из них, я хотел бы иметь возможность устанавливать псевдоним модуля в зависимости от пользовательского ввода и просто запускать этот модуль через тестовый код.
Другими словами, я хочу что-то вроде:
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 ...