どちらの概念でも、新しいデータ型を作成できます。 私が見ることのできる唯一の違いは、関数型言語では、代数的データ型でパターンマッチングを実行できることです。しかし、OO言語には匹敵する簡潔な機能はありません。これは正確な声明ですか?代数データ型の概念はオブジェクト指向言語のクラス定義に似ていますか?
答えて
代数的データ型とOO形式のクラスの3つの大きな違いがあります。違いがあるため、(im)mutablilityは数えません。
- 代数データ型では、商品と同様に合計が許可されますが、OO形式のクラスでは商品のみが許可されます。
- OOスタイルのクラスを使用すると、受け入れられた操作で複合データ項目をバンドルすることができますが、代数データ型は受け入れません。
- 代数データ型は、コンストラクタに渡されるデータと結果の値に格納されるデータを区別しませんが、OO形式のクラスは実行します(または実行できます)。
私が意図的にリストから除外したことの1つはサブタイプ化でした。 OO言語の大部分はサブクラス化(非最終、非密接、現在アクセス可能)なクラスであり、大部分の一般的なMLファミリの関数型言語ではそうではありませんが、仮説的に継承を完全に禁止することは可能ですOO(または少なくともOOのような)言語であり、代数的データ型でサブタイプ化およびスーパータイプ化を生成することも同様に可能である。その限定された例については、Timber
などがあります。クラスは単なる型定義ではありません。ほとんどのオブジェクト指向言語のクラスは、あらゆる種類の緩やかに関連する機能を提供するキッチンシンクの機能です。
特に、クラスは一種のモジュールとして機能し、データ抽象化と名前空間を提供します。代数データ型にはこれが組み込まれていないため、通常、モジュール性は別々の直交するフィーチャ(通常はモジュール)として提供されます。
ある意味では、このように見ることができます。すべての言語には、ユーザー定義型を作成するためのメカニズムが多くあります。機能的(ML、Haskellスタイル)の言語では、唯一のものはADTの作成です。 (ハスケルの新しいタイプは、ADTの退化した症例と見ることができる)。オブジェクト指向言語では、クラスです。手続き言語では、struct
またはrecord
です。
ユーザー定義のデータ型のセマンティクスは言語ごとに異なりますが、パラダイム#1の言語からパラダイム#2の言語まではそれほど変わりません。 @ Pharien's Flameはすでに典型的な違いを概説しています。彼らは「始代数」を形成するので
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)
- は
- パラメトリック多型をサポートしていない
- が可変であるパターンマッチングをサポートしていない
Hmm。タイプサマンドを追加するようなものをサブクラス化しないのですか? (したがって、クラスは基本的に開かれた和です)パラメトリック多形性が代数データ型にどのようにリンクされているかもわかりません。確かに、あなたは他の型よりもそれらをパラメータ化できますが、クラスでそれを行うことはできませんか?また、型の再帰も通常同様に機能します。 –
はい、十分な拡張機能があります。「ジェネリック、サブクラス化、およびバーチャルディスパッチの組み合わせは、オブジェクトの汎用代数データ型の限定と限定使用をサポートします.- 指向プログラミング言語」 - http://research.microsoft。 com/en-us/um/people/akenn/generics/gadtoop.pdf –
- 1. JavascriptのJavaオブジェクト指向の概念
- 2. 変数に関する概念言語
- 3. コンポーネント指向言語とオブジェクト指向言語の違いは何ですか?
- 4. オブジェクトベースのオブジェクト指向言語
- 5. オブジェクト、クラス、メンバ関数の概念
- 6. オブジェクト指向プログラミングの定義
- 7. クラスの概念
- 8. C言語のオブジェクト指向アプリケーション開発
- 9. C++は完全にオブジェクト指向の言語ですか?
- 10. 概念クラス図
- 11. クラス宣言で型を定義していますか?
- 12. 最も純粋なオブジェクト指向言語のいくつかは何ですか?
- 13. PHPオブジェクト指向:オブジェクト定義で宣言されていなくてもプロパティが割り当てられます
- 14. Javaの列挙型:概念疑い
- 15. C++の概念:それ自体がテンプレートである概念を定義できますか?
- 16. 手続き型言語でオブジェクト指向プログラミングの力をどのように体験できますか?
- 17. Mathematicaオブジェクト指向システム(または代替)?
- 18. オブジェクト指向のJavaScript - クラス内のクラスを定義するには? C#の例から
- 19. as3のポインタに似た概念ですか?
- 20. Swiftのカプセル化は他のオブジェクト指向言語のように重要です
- 21. Androidには、iOSに似たAspect Fillの概念がありますか?
- 22. オブジェクト指向の原則を手続き型言語で適用する必要がありますか?
- 23. sqlite概念からcoredata概念へ?
- 24. 概念と宣言の順序
- 25. シンボルオブジェクト指向言語用コンパイラのテーブルスコープ
- 26. ソリューションの代わりに問題を定義するプログラミング言語?
- 27. mysql関数の概念
- 28. 文字列の言語の方向を指定して右に表示する
- 29. 完全なアスペクト指向プログラミング言語はありますか?
- 30. MVCで従来の「ページ」概念を定義するものは何ですか?
ADTは*閉じる*必要はありませんか? HaskellのADTはサブタイプを許可していません(http://blog.tmorris.net/algebraic-data-types-again/経由) – canadadry
@BonAmiいいえ、ADTを閉じる必要はありません。あなたが指摘したように、Haskellはそうですが、Scalaは必ずしもそうであるとは限りません(ケースクラスADTを呼び出すことができる場合)。 –