比方说,我有一个显著类层次结构: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' –