4

我知道可以将方法和属性添加到有区别的联合,但是您可以添加一个在创建联合的实例时必须设置的不可变字段,就像记录中的字段一样?

我想我想做的是结合联合类型和记录类型,如下所示:

type union =
    | OptionOne of int
    | OptionTwo of string
    {
        AFieldUsedForBothCases : string
    }

这不是一个有效的声明。

我知道这可以通过创建记录类型来解决:

type record =
    {
        AFieldUsedForBothCases : string
        TheDiscriminatedUnion : union
    }

但如果可能的话,我想做类似于第一个例子的事情。

4

3 回答 3

5

不,我不这么认为,但是您可以将其附加到两种情况并使用成员提取它:

type union =
    | OptionOne of int * string
    | OptionTwo of string * string
    member u.AFieldUsedForBothCases =
        match u with
        | OptionOne (_,s) | OptionTwo(_,s) -> s

最后,无论如何您都必须在构造函数中指定附加元素。好的,这个可以让您在每个构造函数上重新键入公共元素,但我认为这还不错。

于 2011-09-09T11:30:24.410 回答
3

我认为这是一个更整洁的解决方案

type union=
|a of int
|b of string

type Realtype = string * union

感谢类型检查,可以强制属性设置,而且我觉得比记录方案要整洁一点

于 2011-09-09T12:48:27.197 回答
1

我不认为这是可能的。除了我认为您的第二个代码(使用记录)更有意义的形式之外,因为 DU 是关于“这个或那个或那个......”,现在如果所有这些案例之间有一些共同点,那么我会保留那个共同点在 DU 外面而不是在 DU 里面。

于 2011-09-09T11:32:11.043 回答