2017-03-16 156 views

回答

5

代數數據類型是由和和產品(不同的構造函數和具有多個字段的構造函數)組成的類型。抽象數據類型是一種數據類型,它的實現被定義的API抽象出來......通常在其實現上進行某種封裝。

例如,優先級隊列是一種抽象數據類型。在內存中,它可能被實現爲一個數組,或者堆中的分配單元,或者C中的結構,或者作爲莎士比亞的十四行詩。但是,您可以通過定義良好的界面對其進行抽象:push和pop。您可以優先將物品推入隊列,並且可以隨時彈出最高優先級的物品。 另一個例子是關聯映射或字典,它可以用哈希,二叉搜索樹或訓練有素的海獺來實現。重要的是您定義了查找,插入和刪除操作,這些操作對基礎實現進行抽象。

所以他們真的談論根本不同的事情。一些數據結構實際上可以看作是作爲代數數據類型實現的抽象數據類型!就像Prelude中的commom鏈接列表抽象數據類型一樣,它被實現爲[]代數數據類型。它提供的接口是consing和unconsing,但它實現爲多個構造函數,其中一個具有多個字段 - 和和產品。

+0

這是什麼意思,總和和產品? –

+1

總和類型'S = T | U'是一個類型,其值集合是'T'和'U'類型值集合的總和(聯合)。產品類型「P = T×U」是一組值爲「T」和「U」值集合(笛卡爾積)的類型。最着名的產品類型是「Tuple」和「Record」。 –

+0

元組爲什麼是一個產品類型? –

2

我假設你指的是抽象類型和代數數據類型。 Scala中的大多數人蔘考了sum types的ADT(代數數據類型)。 [產品類型]也是代數數據類型。一個很簡單的例子是樹(你實際上是在你前面的問題一個定義的話):

sealed abstract class Tree[+A] 
case object Leaf extends Tree[Nothing] 
case class Branch[A](left: Tree[A], right: Tree[A], value: A) extends Tree[A] 

抽象類型在Scala中可以通過讓在特質/抽象類未定義一個類型別名實現定義一個粒度表示。這個問題已經回答了here

抽象類型通常用於隱藏有關組件內部結構的信息,因此基本上抽象出某個組件的具體類型。試圖重寫使用抽象類樹表示給出了類似:

sealed trait Tree { 
    type A 
} 
case object Leaf extends Tree { 
    override type A = Nothing 
} 
case class Branch(left: Tree, right: Tree) { 
    // This doesn't really make sense, we don't want to hide A! 
    override type A = ??? 
} 

最後,抽象的種類較多,Scala的類型系統的功能(在這種情況下),同時代數數據類型僅僅是定義的形式複合類型並且獨立於編程語言。

+1

總和類型*和*產品類型。 – pedrofurla

+0

@pedrofurla謝謝,我已經更新了答案:)我省略了這一點,只是因爲我試圖說明在討論ADT時使用Scala思考什麼_most人。儘管列舉其他人也是有道理的。 –

+0

你在這一點上是錯的。 – pedrofurla

相關問題