将多个变体合并为一个变体
Combine multiple variants into one variant
有没有办法将多个变体组合成一个?像这样:
type pet = Cat | Dog;
type wild_animal = Deer | Lion;
type animal = pet | wild_animal;
这是一个语法错误,但我希望 animal 成为具有四个构造函数的变体:Cat | Dog | Deer | Lion
。有办法吗?
多态变体的创建完全符合您的想法。它们作为内存表示的效率较低,但是如果您要将其编译为 JavaScript:
应该无关紧要
type pet = [ | `Cat | `Dog];
type wild_animal = [ | `Deer | `Lion];
type animal = [ pet | wild_animal ];
I would like animal to become a variant with four constructors: Cat | Dog | Deer | Lion. Is there a way to do this?
你不能直接这样做。这意味着 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
。
有没有办法将多个变体组合成一个?像这样:
type pet = Cat | Dog;
type wild_animal = Deer | Lion;
type animal = pet | wild_animal;
这是一个语法错误,但我希望 animal 成为具有四个构造函数的变体:Cat | Dog | Deer | Lion
。有办法吗?
多态变体的创建完全符合您的想法。它们作为内存表示的效率较低,但是如果您要将其编译为 JavaScript:
应该无关紧要type pet = [ | `Cat | `Dog];
type wild_animal = [ | `Deer | `Lion];
type animal = [ pet | wild_animal ];
I would like animal to become a variant with four constructors: Cat | Dog | Deer | Lion. Is there a way to do this?
你不能直接这样做。这意味着 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
。