将多个变体组合成一个变体

时间:2018-06-10 06:16:49

标签: types ocaml variant reason

有没有办法将多个变体组合成一个?像这样:

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

这是语法错误,但我希望动物成为具有四个构造函数的变体:Cat | Dog | Deer | Lion。有没有办法做到这一点?

2 个答案:

答案 0 :(得分:6)

多形变体的创建完全符合您的想法。它们作为内存表示的效率较低,但是如果要将其编译为JavaScript则无关紧要:

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

答案 1 :(得分:5)

  

我希望动物成为四个构造函数的变体:Cat |狗|鹿|狮子。有没有办法做到这一点?

你不能直接这样做。这意味着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