web-dev-qa-db-ja.com

「ポリモーフィズムアラカルト」とは何ですか?どのようにそれから利益を得ることができますか?

彼の講演で Simple Made Easy 、リック・ヒッキーは「アラカルトのポリモーフィズム」について語っています(ビデオの約30:00 )。同じ文脈で、彼はHaskellの 型クラス とClojureの マルチメソッド (およびプロトコル)にも言及しています。

私はこれらの概念にあまり精通していないので、simplicityを達成しようとするときのその有用性を理解したいと思います。 Scalaでのこの概念の例やショーケースに特に興味があります。

70
Grega Kešpret

多形アラカルト多形オンデマンドと見なすことができます。

Clojureコミュニティは、Clojureが複数のポリモーフィズム戦略をサポートしているという事実から、ポリモーフィズムアラカルトという用語を誇りに思っています。それらのいくつかは次のとおりです。

  • プロトタイプベースのポリモーフィズム

  • 継承ポリモーフィズム

    これは、Javaで使用されるポリモーフィズム戦略です。 Clojureはプロキシによってこれをサポートします。 Java相互運用を行うときに便利です。

  • プロトコル

    Clojureのプロトコルは、HaskellのTypeClassと同じです。

  • マルチメソッド

    プロトコルは最初の引数のタイプに基づいてポリモーフィックディスパッチを提供しますが、マルチメソッドははるかに柔軟性があり、メソッドの(任意の)引数の任意の関数に基づいてディスパッチできます。

アラカルトのポリモーフィズムは、「ケースに最適なポリモーフィズム戦略を選択してください。すべてツールボックスにあります」という意味です。

TypeClassパターンをScalaに暗黙的に使用して実装できます。実際の例が必要な場合は、 Scalazソース を読んでください。Scala =言語レベルでのマルチメソッドはサポートしていませんが、次の2.10マクロの助けを借りて可能だと思います。

利点としては、TypeClassやMultimethodなどの高度なポリモーフィズム戦略が Expression Problem の解決に役立ちます。

「目標は、ケースごとにデータ型を定義することです。この場合、既存のコードを再コンパイルせずに、静的な型の安全性を維持しながら(キャストなしなど)、データ型に新しいケースを追加し、データ型に新しい関数を追加できます。」.

ところで、この質問は大きすぎて1つのStackOverflowの質問に収まりません。私の提案は、これらの概念に精通することです。そうすれば、それらの有用性を理解できます。

31
xiefei