2017-03-16 15 views

答えて

5

代数データ型は、合計と積(複数のフィールドを持つ異なるコンストラクタとコンストラクタ)で構成される型です。抽象データ型は、定義されたAPIによって抽象化されたその実装を持つデータ型です。通常、実装上のある種のカプセル化があります。

たとえば、優先度キューは抽象的なデータ型です。メモリ内では、配列として、またはヒープ上に割り当てられたセルとして、あるいはC言語の構造体やシェイクスピア・ソネットとして実装されます。ただし、プッシュとポップという明確に定義されたインターフェースで抽象化しています。アイテムをキューに優先的にプッシュすることができ、いつでも最優先のアイテムをポップできます。 もう1つの例は、ハッシュ、バイナリ検索ツリー、または十分に訓練された海老で実装できる関連マップまたは辞書です。重要な点は、基礎となる実装を抽象化するルックアップ、挿入、および削除操作を定義することです。

彼らは本当に基本的に異なることについて話します。一部のデータ構造は、実際には代数データ型として実装された抽象データ型と見ることができます。 []代数データ型として実装されているPreludeのcommom linked list抽象データ型と同じです。それが提供するインターフェイスはconsingとunconsingですが、複数のコンストラクタとして複数のフィールドを持つコンストラクタとして実装されています。

+0

合計と商品とはどういう意味ですか? –

+1

合計型 'S = T | U'は、値セットが 'T'型と' U'型の値の集合の和(和集合)である型です。製品タイプ「P = T×U」は、その値のセットが「T」および「U」の値のセットの(デカルト)積であるタイプである。最もよく知られている製品タイプは 'Tuple'と' Record'です。 –

+0

タプルはなぜ製品タイプですか? –

2

抽象型と代数データ型を指していると仮定します。 Scalaのほとんどの人は、sum typesについてADT(代数データ型)を参照しています。 [製品タイプ]も代数データ型です。 Scalaでは

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] 

抽象タイプ達成するために、形質/抽象クラスで未定義タイプの別名をさせることで定義することができます非常に単純な例では、ツリーは、(あなたが実際にあなたの前の質問のいずれかでそれを定義した)であります詳細な表現。この質問はすでに回答済みですhere

抽象型は、通常、コンポーネントの内部構造に関する情報を隠すために使用されるため、基本的には、特定のコンポーネントの具体的な型を抽象化するために使用されます。代数的データ型が定義するだけの形態であるが最後に、抽象型は、(この場合)はScalaの型システムの機能のより多くのです

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 = ??? 
} 

:抽象型を使用したツリー表現を書き換えしようとするようなものを提供します複合型であり、プログラミング言語から独立しています。

+1

合計タイプ*と*製品タイプ。 – pedrofurla

+0

@pedrofurlaありがとうございました、私は答えを更新しました:)私は、ADTについて話すときにScalaを使用しているほとんどの人が考えるものを説明しようとしたからです。しかし、他のものも列挙するのは意味があります。 –

+0

あなたは間違っています。 – pedrofurla

関連する問題