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

Posted

技术标签:

【中文标题】将多个变体组合成一个变体【英文标题】:Combine multiple variants into one variant 【发布时间】:2018-06-10 06:16:49 【问题描述】:

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

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

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

【问题讨论】:

【参考方案1】:

多态变体的创建完全符合您的想法。它们作为内存表示的效率较低,但您是否要将其编译为 javascript 并不重要:

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

【讨论】:

您的第一段错误:type t = Cat type w = Cat 在同一模块中完全有效。此外,无参数构造函数在运行时表示为简单的整数。 好吧,刚刚删除了第一段,因为另一个答案解释得更好。 我不认为多态变体效率较低。他们只是使用哈希值而不是从 0 开始计数。但大多数情况下,如果您使用 0, 1, 2, 3 或 45346, 464575678, 6354645674, 32542 作为变量的值,则没有区别。 当您不使用具有多态变体的参数时,情况确实如此。当你这样做时,这会改变:dev.realworldocaml.org/…【参考方案2】:

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

你不能直接这样做。这意味着Catpet 类型,但也有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

【讨论】:

聪明啊!对于那些不熟悉常规 ocaml 语法的人,最后一条语句是type animal = Pet(pet) | Wild_animal(wild_animal) in reason

以上是关于将多个变体组合成一个变体的主要内容,如果未能解决你的问题,请参考以下文章

QML - 无法将组合框模型绑定到变体列表项

PHP+MySQL 中的前端产品变体?

Android 库 - 使用 Gradle 将多个变体发布到本地 Maven 存储库

AngularJS,如何将多个输入组合成一个 ng 模型?具体来说,将日期、时间和时区输入组合到 datetime 对象中

Shopify - 通过多个变体 ID 检索多个变体详细信息

为同一应用程序的多个变体重用多个证书的 CSR