首页 > 解决方案 > 有没有办法使用 sum 类型的 case 作为另一种类型的类型参数?

问题描述

有什么办法可以做到以下几点:

type First = |A |B

type Second = |C of First |D of A

在上述情况下,我想指定 D 使其只能包含 aFirst类型A而不是 any First。有什么办法可以在声明中强加这个约束?

标签: f#

解决方案


在您的示例中,A是一个联合案例,它是一个值,而不是一个类型。但是每个案例的内容都需要一个类型,这就是代码没有意义的原因。出于同样的原因,您不能创建一个接受类型值的函数,A因为它不是类型。让我们解决这个问题。

假设案例A包含一些数据(A of int list list)。您可以使用类型别名为int list list. 然后您可以在其他地方重用类型名称:

type A = int list list

type First =
    | A of A
    | B

type Second =
    | C of First
    | D of A

现在您还可以编写一个接受 type 值的函数A

创建一个与它包含的类型具有相同名称的案例(例如A of A)是一种常见的做法。只需清楚区分 caseA和 type A


推荐阅读