Можно ли динамически создавать полиморфный вариантный тип с использованием модулей?

Я пытаюсь систематизировать и повторно использовать свой код 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с и schemaTypes.

примеры:

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 до модуля из списка для быстрого доступа.

Другие вопросы по тегам