のは、私は重要なクラス階層があるとしましょう:F#:区別された共用体とクラス階層を組み合わせる?
Tag
ControlFlowTag
IfTag
ForTag
JumpTag
HTMLTag
DivTag
と私は、これらとの文字列が点在リストを作りたいです。
let MyList = [tagA, tagB, "some text", tagC]
は、と私はそれが
type Node =
| Tag of Tag
| String of String
let MyList: list<Node> = [tagA, tagB, "some text", tagC]
悲しいかな、それは明らかに
let MyList: list<Node> = [Tag tagA, Tag tagB, String "some text", Tag tagC]
タグなしでは動作しません。また、文字列がノードに記述直交し、分離されている労働組合を区別できると思っていました既存のタグ/文字列クラスから削除します。マウスオーバーで私にはNode.Tag
とNode.String
というタイプが与えられますが、これは私が望むものではありません。
私が今持っていることは私にはかなりいいですが、余分なt
が視覚的ノイズに追加されます
let MyList : list<Tag> = [tagA, tagB, t"some text", tagC]
を与え、Tag
から継承StringTag
を作成する関数t
です。私が実際に望んでいるのは、match
ステートメントを使用して作業できる強く型付けされた "2つの異なるタイプのリスト"です。私はこれがDiscriminated Unionsのポイントだと思っていましたが、既存の階層(この場合はTag
)が複雑なので、既存の型階層を使用できないという問題があります。そのタイプのサブセットに対する完全なOO継承アプローチがより明確である純粋に差別化された同盟のアプローチより
1つの選択肢はobj
のリストにしてmatch
の前後にすべてをキャストすることですが、これはあまりうまくありません。他の方法はありますか?
または: 'type Node = Bar of Tag |タグのフー ' –