有什么办法可以执行以下操作:
false
在上述情况下,我想指定D,使其只能包含类型type First = |A |B
type Second = |C of First |D of A
的{{1}}而不是任何First
。有什么办法可以在声明中强加此约束吗?
答案 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
中的First
和D
中的Second
共享的通用类型:
type MyA =
| A
type First =
| A of MyA
| B
type Second =
| C of First
| D of MyA
这样,您可以将First.A
和Second.D
设置为相同的类型。