2012-05-09 6 views

答えて

3

代数的データ型とOO形式のクラスの3つの大きな違いがあります。違いがあるため、(im)mutablilityは数えません。

  • 代数データ型では、商品と同様に合計が許可されますが、OO形式のクラスでは商品のみが許可されます。
  • OOスタイルのクラスを使用すると、受け入れられた操作で複合データ項目をバンドルすることができますが、代数データ型は受け入れません。
  • 代数データ型は、コンストラクタに渡されるデータと結果の値に格納されるデータを区別しませんが、OO形式のクラスは実行します(または実行できます)。

私が意図的にリストから除外したことの1つはサブタイプ化でした。 OO言語の大部分はサブクラス化(非最終、非密接、現在アクセス可能)なクラスであり、大部分の一般的なMLファミリの関数型言語ではそうではありませんが、仮説的に継承を完全に禁止することは可能ですOO(または少なくともOOのような)言語であり、代数的データ型でサブタイプ化およびスーパータイプ化を生成することも同様に可能である。その限定された例については、Timber

+1

ADTは*閉じる*必要はありませんか? HaskellのADTはサブタイプを許可していません(http://blog.tmorris.net/algebraic-data-types-again/経由) – canadadry

+0

@BonAmiいいえ、ADTを閉じる必要はありません。あなたが指摘したように、Haskellはそうですが、Scalaは必ずしもそうであるとは限りません(ケースクラスADTを呼び出すことができる場合)。 –

3

などがあります。クラスは単なる型定義ではありません。ほとんどのオブジェクト指向言語のクラスは、あらゆる種類の緩やかに関連する機能を提供するキッチンシンクの機能です。

特に、クラスは一種のモジュールとして機能し、データ抽象化と名前空間を提供します。代数データ型にはこれが組み込まれていないため、通常、モジュール性は別々の直交するフィーチャ(通常はモジュール)として提供されます。

3

ある意味では、このように見ることができます。すべての言語には、ユーザー定義型を作成するためのメカニズムが多くあります。機能的(ML、Haskellスタイル)の言語では、唯一のものはADTの作成です。 (ハスケルの新しいタイプは、ADTの退化した症例と見ることができる)。オブジェクト指向言語では、クラスです。手続き言語では、structまたはrecordです。

ユーザー定義のデータ型のセマンティクスは言語ごとに異なりますが、パラダイム#1の言語からパラダイム#2の言語まではそれほど変わりません。 @ Pharien's Flameはすでに典型的な違いを概説しています。彼らは「始代数」を形成するので

8

Algebraic data typesはので、すべての定期的なデータ型を構築することができ、これらの事業者から

+ represents sum types (disjoint unions, e.g. Either). 
• represents product types (e.g. structs or tuples) 
X for the singleton type (e.g. data X a = X a) 
1 for the unit type() 
and μ for the least fixed point (e.g. recursive types), usually implicit. 

、命名されています。 代数データ型は、パラメトリックポリモフィズムもサポートしています。つまり、静的な安全性を保証しながら、基礎となるタイプの制約として使用できます。さらに、ADTには、コンストラクタやパターンマッチングを使用してデータ型を導入および削除するための統一構文が用意されています。例えば。

-- this defines a tree 
data Tree a = Empty | Node a (Tree a) (Tree a) 

-- this constructs a tree 
let x = Node 1 (Node 2 Empty) Empty 

-- this deconstructs a tree 
f (Node a l r) = a + (f l) + (f r) 

彼らは不変だという事実と一緒に代数的データ型の豊かさと均一性、その大部分は、OOオブジェクトを区別しない:

  • 唯一の製品の種類を表す(そう何再帰的または合計-types)
  • パラメトリック多型をサポートしていない
  • が可変であるパターンマッチングをサポートしていない
+0

Hmm。タイプサマンドを追加するようなものをサブクラス化しないのですか? (したがって、クラスは基本的に開かれた和です)パラメトリック多形性が代数データ型にどのようにリンクされているかもわかりません。確かに、あなたは他の型よりもそれらをパラメータ化できますが、クラスでそれを行うことはできませんか?また、型の再帰も通常同様に機能します。 –

+0

はい、十分な拡張機能があります。「ジェネリック、サブクラス化、およびバーチャルディスパッチの組み合わせは、オブジェクトの汎用代数データ型の限定と限定使用をサポートします.- 指向プログラミング言語」 - http://research.microsoft。 com/en-us/um/people/akenn/generics/gadtoop.pdf –

関連する問題