2011-09-09 3 views
4

差別化されたユニオンにメソッドとプロパティを追加することは可能ですが、レコードのフィールドと同様に、インスタンスがユニオンが作成されたときに設定する必要がある不変フィールドを追加できますか?差別化されたユニオンの不変フィールド

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

有効な宣言されていない。

私は私が何をしたいのですがどうなったと思うが、このように、労働組合のタイプとレコードタイプを組み合わせることです。

私は、これはレコード型を作成することによって解決することができます知っている:

type record = 
    { 
     AFieldUsedForBothCases : string 
     TheDiscriminatedUnion : union 
    } 

が、私は、可能な場合は、最初の例と同様に何かをしたいと思います。

答えて

5

ありません、私はそうは思いませんが、どちらの場合にそれを追加し、メンバーとそれを抽出することができます。

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

最後にあなたはとにかくあなたのコンストラクタで追加の要素を指定する必要があります。これですべてのコンストラクタで共通要素を再入力できますが、それほど悪くはないと思います。

+0

はいああ、良い考えより少しすっきりだと思います。ありがとう! – rankAmateur

+0

FYI - 共用体の場合、 'member'が' | 'と整列されている場合は' with'を省略できます。 – Daniel

+0

ありがとうございます - アライメントは醜いことがあります(ここで一致して見てください) - しかし、私はこれを念頭に置いておきます – Carsten

1

私は可能ではないと思います。私はあなたの2番目のコード(レコードを使用して)は、DUが「これか、それか、それについて」ということになるので、もっと意味をなさないと思っています。今、これらすべての事件の間に共通するものがあれば、 DUの中ではなくDUの外に出る。

+0

ええ、あなたは正しいかもしれませんが、私は基本的にはC#コードにある継承階層を複製しようとしていますが、差別化された組合はそうする最良の方法ではない。機能プログラミングはまだ少し新しくなっています... – rankAmateur

3

私は、これは

type union= 
|a of int 
|b of string 

type Realtype = string * union 

おかげで、あなたがプロパティの設定を強制することができますチェックを入力するにはすっきり解決策だと思う、と私はそれが記録液

関連する問題