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は「これかあれかあれ...」に関するものなので、2番目のコード(レコードを使用)の方がはるかに理にかなっていると思いますが、これらすべてのケースに共通するものがある場合は、その共通点を維持しますDUの内部ではなく、DUの外部。

于 2011-09-09T11:32:11.043 に答える