【发布时间】:2011-12-29 03:33:36
【问题描述】:
假设我有一个重要的类层次结构:
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 和 String 是正交的,并且与现有的 Tag/String 类分开。将鼠标悬停会给我Node.Tag 和Node.String 这样的类型,这不是我想要的。
我现在拥有的是一个函数t,它创建了一个继承自Tag的StringTag,给了我
let MyList : list<Tag> = [tagA, tagB, t"some text", tagC]
这很不错,但是额外的t 增加了视觉噪音。我真正想要的是一个强类型的“两种不同类型的列表”,我可以使用match 语句来处理它。我认为这是区分联合的重点,但它们无法使用现有的类型层次结构是一个问题,因为现有的层次结构(在本例中为 Tag)足够复杂,我认为该类型子集的完整 OO 继承方法比纯粹的歧视联盟方法更清晰
一种选择是将其设为obj 的列表并在match 之前/期间强制转换所有内容,但这并不是很好。还有其他方法吗?
【问题讨论】: