Объединить несколько вариантов в один вариант - PullRequest
0 голосов
/ 10 июня 2018

Есть ли способ объединить несколько вариантов в один?Примерно так:

type pet = Cat | Dog;
type wild_animal = Deer | Lion;
type animal = pet | wild_animal;

Это синтаксическая ошибка, но я бы хотел, чтобы animal стал вариантом с четырьмя конструкторами: Cat | Dog | Deer | Lion.Есть ли способ сделать это?

Ответы [ 2 ]

0 голосов
/ 10 июня 2018

Я бы хотел, чтобы animal стал вариантом с четырьмя конструкторами: Cat |Собака |Олень |Lion.Есть ли способ сделать это?

Вы не можете сделать это напрямую.Это значит, что Cat имеет тип pet, но также и тип wild_animal.Это невозможно при использовании обычных вариантов, которые всегда имеют один тип.Однако это возможно с полиморфными вариантами, как описывает другой ответ.

Другое, более распространенное решение (но оно зависит от того, чего вы пытаетесь достичь), состоит в определении второго уровня вариантов:

type pet = Cat | Dog
type wild_animal = Deer | Lion
type animal = Pet of pet | Wild_animal of wild_animal

Таким образом, Cat имеет тип pet, но Pet Cat имеет тип animal.

0 голосов
/ 10 июня 2018

Полиморфные варианты создаются именно с вашей идеей.Они менее эффективны, чем представление памяти, но это не должно иметь значения, если вы собираетесь скомпилировать его в JavaScript:

type pet = [ | `Cat | `Dog];
type wild_animal = [ | `Deer | `Lion];
type animal = [ pet | wild_animal ];
...