Simple Made Easyの講演で、Rick Hickey は「Polymorphism a la carte」(ビデオの 30:00 頃) について語っています。同じコンテキストで、彼は Haskell の型クラスと Clojure のマルチメソッド(およびプロトコル) についても言及しています。
私はこれらの概念にあまり詳しくないので、シンプルさを達成しようとするときの有用性を理解したいと思います。Scalaでのこの概念の例やショーケースに特に興味があります。
Simple Made Easyの講演で、Rick Hickey は「Polymorphism a la carte」(ビデオの 30:00 頃) について語っています。同じコンテキストで、彼は Haskell の型クラスと Clojure のマルチメソッド(およびプロトコル) についても言及しています。
私はこれらの概念にあまり詳しくないので、シンプルさを達成しようとするときの有用性を理解したいと思います。Scalaでのこの概念の例やショーケースに特に興味があります。
Polymorphism on demandとして、Polymorphism a la carteを利用できます。
Clojure コミュニティは、Clojure が複数のポリモーフィズム戦略をサポートしているため、ポリモーフィズム アラカルトという用語を誇りに思っています。それらのいくつかは次のとおりです。
継承多型
これは、Java で使用されるポリモーフィズム戦略です。Clojure はプロキシによってこれをサポートします。Java 相互運用を行う場合に便利です。
プロトコル
Clojure へのプロトコルは、Haskell への TypeClass と同じです。
マルチメソッド
プロトコルは最初の引数の型に基づいてポリモーフィックなディスパッチを提供しますが、マルチメソッドははるかに柔軟で、メソッドの (任意の) 引数の任意の関数に基づいてディスパッチできます。
ポリモーフィズム アラカルトとは、「ケースに最適なポリモーフィズム戦略を選択してください。それらはすべてツールボックスにあります」という意味です。
TypeClass
暗黙を使用して Scala でパターンを実装できます。実際の例が必要な場合は、Scalaz のソースを読んでください。Scala は言語レベルでマルチメソッドをサポートしていませんが、2.10 のマクロを使えば可能だと思います。
利点としては、TypeClass や Multimethod などの高度なポリモーフィズム戦略がExpression Problemの解決に役立ちます。
「目標は、ケースごとにデータ型を定義することです。これにより、既存のコードを再コンパイルせずに、データ型に新しいケースを追加したり、データ型に新しい関数を追加したり、静的な型の安全性を維持したりできます (キャストなしなど)」.
ところで、この質問は大きすぎて 1 つの StackOverflow の質問に収まりません。私の提案は、これらの概念に慣れることです。そうすれば、それらの有用性が理解できるようになります。