比方說,我有一個顯著類層次結構: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]
顯然,標籤工作,並在字符串描述節點是正交獨立來自現有的Tag/String類。鼠標懸停給我的類型爲Node.Tag
和Node.String
,這不是我想要的。
我現在已經是一個功能t
它創建了一個StringTag
從Tag
繼承,給我
let MyList : list<Tag> = [tagA, tagB, t"some text", tagC]
這是相當不錯的,但額外的t
增加了視覺噪聲。我真正想要的是一個強類型的「兩種不同類型的清單」,我可以使用match
聲明來處理這些清單。我認爲這是歧視聯盟的重點,但是他們無法使用現有的類型層次結構是一個問題,因爲現有的層次結構(在本例中爲Tag
)足夠複雜,我認爲對該類型子集的完整的OO繼承方法更清晰而不是純粹的歧視聯盟方法
其中一種方法是將其設置爲obj
的列表,並在match
之前/期間投射所有內容,但這並不是很好。還有其他方法嗎?
甚至:'type Node = Bar of Bar |標記Foo' –