Можно ли динамически создавать полиморфный вариантный тип с использованием модулей?
Я пытаюсь систематизировать и повторно использовать свой код reasonML. У меня есть типы моделей модулей, которые выглядят следующим образом:
module Diet = {
let schema = `DietSchema;
type idType = [`DietId(UUID.t)];
type idAsType('a) = [> | `DietId(UUID.t)] as 'a;
type schemaType = [`DietSchema];
};
module Ingredient = {
let schema = `IngredientSchema;
type idType = [`IngredientId(UUID.t)];
type idAsType('a) = [> | `IngredientId(UUID.t)] as 'a;
type schemaType = [`IngredientSchema];
};
module Restriction = {
let schema = `RestrictionSchema;
type idType = [`RestrictionId(UUID.t)];
type idAsType('a) = [> | `RestrictionId(UUID.t)] as 'a;
type schemaType = [`RestrictionSchema];
};
И я хотел бы генерировать типы и функции из idType
с и schemaType
s.
примеры:
type modelIdType = [
| Diet.idType
| Restriction.idType
| Ingredient.idType
];
type schemaType = [
| Diet.schemaType
| Restriction.schemaType
| Ingredient.schemaType
];
let modelIdToIdFunction = (recordIdType): (schemaType, UUID.t) =>
switch (recordIdType) {
| `DietId(uuid) => (Diet.schema, uuid)
| `RestrictionId(uuid) => (Restriction.schema, uuid)
| `IngredientId(uuid) => (Ingredient.schema, uuid)
};
Поэтому я пытаюсь построить модуль с помощью функтора, пропуская каждую из схем через
module ProcessSchema = (
Schema : SchemaType,
PrevFullSchema : FullSchema
) : (FullSchema) => {
type id = [> Schema.idType' | PrevFullSchema.id'('a)] as 'a;
/* type id = [PrevFullSchema.openId(PrevFullSchema.id) | Schema.idType]; */
/* type schema = [PrevFullSchema.schema | Schema.schema]; */
/* type openSchema = [PrevFullSchema.schema | Schema.schema]; */
};
Хотя явно приведенный выше код не совсем сработал. Я не знал, как добавить типы модулей в модельные модули вверху.
Итак, возможно ли динамически создавать полиморфные типы вариантов с использованием модулей и функторов?
Если нет, то возможно ли построить полиморфные варианты вариантов, используя "список модулей"?
Спасибо
0 ответов
Кто-то задавал подобный вопрос еще в 2002 году. По словам одного из разработчиков языка OCaml, невозможно динамически расширять полиморфные типы вариантов, подобные этому: https://caml-list.inria.narkive.com/VVwLM96e/module-types-and-polymorphic-variants. Соответствующий бит:
В определении функтора отказано, потому что "Тип Mt не является полиморфным типом варианта". Есть ли обходной путь?
Не то чтобы я знал. Полиморфное расширение варианта работает только для известных закрытых типов вариантов, иначе оно не будет правильным.
В остальной части поста есть предложение, которое сводится к захвату новых типов вариантов внутри разных тегов, но опять-таки это не сработает для вашего случая использования динамического "сложения" типов с помощью функтора.
Для типов вы можете использовать расширяемый вариантный тип. Но для функции modelIdToIdFunction, содержащей список модулей, я думаю, что вы можете искать только в списке, который не будет масштабироваться.
Вы должны расширить uuid с идентификатором для каждого модуля, чтобы вы могли создать таблицу поиска от module_id до модуля из списка для быстрого доступа.