有什么方法可以将总和类型的情况用作另一种类型的类型参数?

时间:2020-05-04 12:48:10

标签: f#

有什么办法可以执行以下操作:

false

在上述情况下,我想指定D,使其只能包含类型type First = |A |B type Second = |C of First |D of A 的{​​{1}}而不是任何First。有什么办法可以在声明中强加此约束吗?

2 个答案:

答案 0 :(得分:2)

在您的示例中,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

现在您还可以编写一个函数,其值类型为A

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

答案 1 :(得分:1)

只需一步,您就能获得一些收益。您将需要由A中的FirstD中的Second共享的通用类型:

type MyA =
| A

type First =
| A of MyA
| B

type Second =
| C of First
| D of MyA

这样,您可以将First.ASecond.D设置为相同的类型。