Можно ли динамически создавать полиморфный вариантный тип с использованием модулей? - PullRequest
0 голосов
/ 01 декабря 2018

Я пытаюсь найти и повторно использовать свой код reasonML.У меня есть типы модулей моделей, которые выглядят следующим образом:

module Diet = {

  type schemaType = [`DietSchema];
  type idType = [`DietId(UUID.t)];

  let schema = `DietSchema;
  type idAsType('a) = [> | idType] as 'a;     
};

module Ingredient = {
  type schemaType = [`IngredientSchema];
  type idType = [`IngredientId(UUID.t)];

  let schema = `IngredientSchema;
  type idAsType('a) = [> | idType] as 'a;
};

module Restriction = {
  type schemaType = [`RestrictionSchema];
  type idType = [`RestrictionId(UUID.t)];

  let schema = `RestrictionSchema;
  type idAsType('a) = [> | idType] as 'a;
};

И я хотел бы генерировать типы и функции из idType s и 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 Diet : SchemaType = {
  /* ... */
};

module type SchemaType {
  type schemaType;
  type idType;

  let schema: [> schemaType];
  type idAsType('a) = [> | idType] as 'a;
};

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]; */
};

Приведенный выше код не работает.У меня проблемы с добавлением типов модулей к модельным модулям вверху.Я также пытался использовать тип модуля SchemaType, но продолжал нажимать The type idType is not a polymorphic variant type, когда хотел, чтобы каждая модель имела разные типы полиморфных переменных.

Итак, в общем, я хочу знать, возможно ли создать полиморфный вариантный тип, который может быть создан или расширен с использованием модулей и функторов?

Если нет, то возможно ли создать полиморфный вариантный типиспользуя "список модулей"?

Спасибо

Ответы [ 2 ]

0 голосов
/ 12 декабря 2018

Кто-то задавал подобный вопрос еще в 2002 году. По словам одного из разработчиков языка OCaml, невозможно динамически расширять полиморфные типы вариантов, например: https://caml -list.inria.narkive.com / VVwLM96e /модульные типы и полиморфные варианты .Соответствующий бит:

В определении функтора отказано, потому что "Тип Mt не является полиморфным вариантом типа" Есть ли обходной путь?

Не то, что язнать.Полиморфное расширение варианта работает только для известных закрытых типов вариантов, иначе оно не будет звучать.

В остальной части поста есть предложение, которое сводится к захвату новых типов вариантов внутри разных тегов, но опять жеэто не сработало бы для вашего случая динамического «сложения» типов с помощью функтора.

0 голосов
/ 07 декабря 2018

Для типов вы можете использовать расширяемый вариантный тип.Но для функции modelIdToIdFunction, имеющей список модулей, я думаю, что вы можете искать только в списке, который не будет масштабироваться.

Вы должны расширить uuid с идентификатором для каждого модуля, чтобы вы могли создать таблицу поискаиз module_id в модуль из списка для быстрого доступа.

...