標籤聯合

標籤聯合(tagged union)也稱可辨識聯合(discriminated union)或者變體類型(variant type),指的是這樣的一種數據結構,它能夠存儲一組不同但是固定的類型中某個類型的對象,具體是哪個類型由標籤欄位決定。這種數據結構在解釋器、資料庫和數據通信中非常有用。需要注意的是,可辨識聯合英文原詞在數學中又指不相交並集(disjoint union)。

基本介紹

  • 中文名:標籤聯合
  • 外文名:Tagged union
  • 又稱:可辨識聯合
  • 性質:一種數據結構
  • 領域:計算機科學
簡介,優點,缺點,類層次結構作為標記聯合,

簡介

在計算機科學中,標記聯合也稱為變體變體記錄選擇類型區分聯合不相交聯合總和類型,是用於保存可能採用多種不同但固定類型的值的數據結構。任何時候只能使用其中一種類型,標籤欄位明確指出哪一種正在使用中。它可以被認為是一種具有多個“案例”的類型,每種類型都應該在該類型被操縱時正確處理。像普通工會一樣,帶標籤的聯合可以通過重疊每種類型的存儲區域來節省存儲空間,因為一次只能使用一個存儲區域。
標記的聯合在函式式語言中最為重要,例如MLHaskell,它們被稱為數據類型(參見代數數據類型),編譯器能夠驗證總是處理標記聯合的所有情況,從而避免許多類型的錯誤。然而,它們可以用幾乎任何語言來構建,並且比未標記的工會更安全,通常簡稱為工會,這些工會相似,但沒有明確記錄工會目前正在使用哪個成員。
標籤聯合往往伴隨著一個概念型的構造,這是相似但不相同的構造一類。給定初始標籤類型和相應的類型,類型構造函式產生帶標籤的聯合類型。
在數學上,標記的聯合對應於不相交或歧視的聯合,通常使用+編寫。給定一個不相交並的一個元素甲+乙,有可能確定它是否從來到甲或乙。如果一個元素在於兩個,會有在值兩個有效不同拷貝甲+乙,一個來自甲,一個來自乙。
一個枚舉類型可以看作是一個退化情況:的標籤聯合單元類型。它對應於一組空的構造函式,可以作為一個簡單的標記變數來實現,因為除了標記的值之外,它不包含附加數據。
許多編程技術和數據結構 - 包括rope(數據結構),懶惰評估,類層次結構(見下文),任意精度算法,CDR編碼,間接位和其他種類的標記指針等 - 通常使用一些某種標記的聯盟。
加標籤的聯合可以看作是最簡單的自描述數據格式。加標籤的聯合的標籤可以看作是最簡單的元數據

優點

標記聯合與未標記聯合的主要優點是所有訪問都是安全的,編譯器甚至可以檢查是否處理了所有的情況。無標記的聯合依賴於程式邏輯來正確識別當前活動的欄位,如果邏輯失敗,這可能會導致奇怪的行為和難以發現的錯誤。
對於包含每種類型欄位的簡單記錄,標記聯合的主要優點是它通過為所有類型重疊存儲來節省存儲空間。一些實現為最大類型保留足夠的存儲空間,而另一些實現根據需要動態調整已標記的聯合值的大小。當該值不可變時,分配儘可能多的存儲空間非常簡單。

缺點

標記聯合的主要缺點是標籤占用空間。由於通常只有少量的替代品,標籤通常可以在可找到空間的地方擠入2或3位,但有時甚至這些位都不可用。在這種情況下,有用的替代方案可以是摺疊計算編碼標籤,其中標籤值是根據聯合欄位的內容動態計算的。常見的例子是使用保留,例如,返回一個正數的函式可能返回-1來指示失敗,並且標記最常用於標記指針。
有時,未標記的聯合會用於執行類型之間的位級轉換,稱為C ++中的reinterpret轉換。加標籤的工會不適用於此目的;通常每當標籤被更改時都會分配一個新值。
許多語言在某種程度上支持通用數據類型,該類型包含每種其他類型的每個值,並且通常提供一種方法來測試通用類型的實際值類型。這些有時被稱為變體。雖然通用數據類型在其正式定義中與標記的聯合相當,但典型的標記聯合包含的案例數量相對較少,這些案例形成了表達單一連貫概念的不同方式,如數據結構節點或指令。此外,還有一個期望,即標記聯盟的每種可能情況在使用時都會被處理。通用數據類型的值不相關,並且沒有可行的方法來處理它們。
與選項類型和異常處理一樣,標記的聯合有時用於處理異常結果的發生。通常這些標籤被摺疊為“保留值”類型,並且它們的出現並不一致地被檢查:這是編程錯誤的相當常見的來源。

類層次結構作為標記聯合

在面向對象編程中的典型類層次結構中,每個子類可以封裝對該類唯一的數據。用於執行虛擬方法查找的元數據(例如,大多數C ++實現中的對象的vtable指針)標識子類,因此可以有效地用作識別實例存儲的特定數據的標籤(請參閱RTTI)。一個對象的構造函式設定這個標記,並且在整個對象的生命周期中它保持不變。
儘管如此,類層次結構涉及真正的亞型多態性;它可以通過創建相同基類型的更多子類來擴展,在標籤/調度模型下無法正確處理。因此,通常不可能像標記聯合會那樣對子對象的“標籤”進行案例分析或分派。一些語言如Scala允許基類被“密封”,並將帶標記的聯合與密封的基類進行統一。

相關詞條

熱門詞條

聯絡我們