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