标签联合

科技工作者之家 2020-11-17

标签联合(tagged union)也称可辨识联合(discriminated union)或者变体类型(variant type),指的是这样的一种数据结构,它能够存储一组不同但是固定的类型中某个类型的对象,具体是哪个类型由标签字段决定。这种数据结构在解释器、数据库和数据通信中非常有用。需要注意的是,可辨识联合英文原词在数学中又指不相交并集(disjoint union)。

简介在计算机科学中,标记联合也称为变体变体记录选择类型区分联合不相交联合总和类型,是用于保存可能采用多种不同但固定类型的值的数据结构。任何时候只能使用其中一种类型,标签字段明确指出哪一种正在使用中。它可以被认为是一种具有多个“案例”的类型,每种类型都应该在该类型被操纵时正确处理。像普通工会一样,带标签的联合可以通过重叠每种类型的存储区域来节省存储空间,因为一次只能使用一个存储区域。

标记的联合在函数式语言中最为重要,例如ML和Haskell,它们被称为数据类型(参见代数数据类型),编译器能够验证总是处理标记联合的所有情况,从而避免许多类型的错误。然而,它们可以用几乎任何语言来构建,并且比未标记的工会更安全,通常简称为工会,这些工会相似,但没有明确记录工会目前正在使用哪个成员。

标签联合往往伴随着一个概念型的构造,这是相似但不相同的构造一类。给定初始标签类型和相应的类型,类型构造函数产生带标签的联合类型。

在数学上,标记的联合对应于不相交或歧视的联合,通常使用+编写。给定一个不相交并的一个元素甲+乙,有可能确定它是否从来到甲或乙。如果一个元素在于两个,会有在值两个有效不同拷贝甲+乙,一个来自甲,一个来自乙。

一个枚举类型可以看作是一个退化情况:的标签联合单元类型。它对应于一组空的构造函数,可以作为一个简单的标记变量来实现,因为除了标记的值之外,它不包含附加数据。

许多编程技术和数据结构 - 包括rope(数据结构),懒惰评估,类层次结构(见下文),任意精度算法,CDR编码,间接位和其他种类的标记指针等 - 通常使用一些某种标记的联盟。

加标签的联合可以看作是最简单的自描述数据格式。加标签的联合的标签可以看作是最简单的元数据。1

优点标记联合与未标记联合的主要优点是所有访问都是安全的,编译器甚至可以检查是否处理了所有的情况。无标记的联合依赖于程序逻辑来正确识别当前活动的字段,如果逻辑失败,这可能会导致奇怪的行为和难以发现的错误。

对于包含每种类型字段的简单记录,标记联合的主要优点是它通过为所有类型重叠存储来节省存储空间。一些实现为最大类型保留足够的存储空间,而另一些实现根据需要动态调整已标记的联合值的大小。当该值不可变时,分配尽可能多的存储空间非常简单。2

缺点标记联合的主要缺点是标签占用空间。由于通常只有少量的替代品,标签通常可以在可找到空间的地方挤入2或3位,但有时甚至这些位都不可用。在这种情况下,有用的替代方案可以是折叠计算编码标签,其中标签值是根据联合字段的内容动态计算的。常见的例子是使用保留值,例如,返回一个正数的函数可能返回-1来指示失败,并且标记值最常用于标记指针。

有时,未标记的联合会用于执行类型之间的位级转换,称为C ++中的reinterpret转换。加标签的工会不适用于此目的;通常每当标签被更改时都会分配一个新值。

许多语言在某种程度上支持通用数据类型,该类型包含每种其他类型的每个值,并且通常提供一种方法来测试通用类型的实际值类型。这些有时被称为变体。虽然通用数据类型在其正式定义中与标记的联合相当,但典型的标记联合包含的案例数量相对较少,这些案例形成了表达单一连贯概念的不同方式,如数据结构节点或指令。此外,还有一个期望,即标记联盟的每种可能情况在使用时都会被处理。通用数据类型的值不相关,并且没有可行的方法来处理它们。

与选项类型和异常处理一样,标记的联合有时用于处理异常结果的发生。通常这些标签被折叠为“保留值”类型,并且它们的出现并不一致地被检查:这是编程错误的相当常见的来源。2

类层次结构作为标记联合在面向对象编程中的典型类层次结构中,每个子类可以封装对该类唯一的数据。用于执行虚拟方法查找的元数据(例如,大多数C ++实现中的对象的vtable指针)标识子类,因此可以有效地用作识别实例存储的特定数据的标签(请参阅RTTI)。一个对象的构造函数设置这个标记,并且在整个对象的生命周期中它保持不变。

尽管如此,类层次结构涉及真正的亚型多态性;它可以通过创建相同基类型的更多子类来扩展,在标签/调度模型下无法正确处理。因此,通常不可能像标记联合会那样对子对象的“标签”进行案例分析或分派。一些语言如Scala允许基类被“密封”,并将带标记的联合与密封的基类进行统一。1

本词条内容贡献者为:

宋春霖 - 副教授 - 江南大学

科技工作者之家

科技工作者之家APP是专注科技人才,知识分享与人才交流的服务平台。