Я пытаюсь создать журнал и повторно использовать свой код 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
, когда я хотел, чтобы каждая модель имела разные типы полиморфных переменных.
Итак, в целом, я хочу знать, можно ли создать полиморфный вариантный тип, который можно создать или расширить с помощью модулей и функторов?
Если нет, можно ли построить полиморфные вариантные типы, используя «список модулей»?
Спасибо
[> `this | `that]
, но это подразумевает переменную типа, т.е. это действительно[> `this | `that] as 'a
. - person glennsl   schedule 02.12.2018