そこで、同僚/友人に Scala の型クラス パターンの例を見せていました。次のようになります。
case class Song(name: String, artist: String)
case class Address(street: String, number: Int)
trait LabelMaker[T] {
def output(t: T): String
}
object LabelMaker {
implicit object addressLabelMaker extends LabelMaker[Address] {
def output(address: Address) = {
address.number + " " + address.street + " street"
}
}
implicit object songLabelMaker extends LabelMaker[Song] {
def output(song: Song) = {
song.artist + " - " + song.name
}
}
def label[T : LabelMaker](t: T) = implicitly[LabelMaker[T]].output(t)
}
次のように使用できます。
import LabelMaker._
println(label(new Song("Hey Ya", "Outkast"))) // Outkast - Hey Ya
println(label(new Address("Smithsonian", 273))) // 273 Smithsonian street
これは最良の例ではありません。振り返ってみると、もっと良い例を思いつきたいと思います。彼に見せると、彼は反例を挙げて答え、型クラス パターンが実際にどのような利点をテーブルにもたらすかを尋ねました。
case class Song(name: String, artist: String)
case class Address(street: String, number: Int)
object LabelMaker {
def label(address: Address) = {
address.number + " " + address.street + " street"
}
def label(song: Song) = {
song.artist + " - " + song.name
}
}
import LabelMaker._
println(label(new Song("Hey Ya", "Outkast"))) // Outkast - Hey Ya
println(label(new Address("Smithsonian", 273))) // 273 Smithsonian street
私はそれに適切に答えるのに苦労しました.100%の利益をよく理解していないことに気づきました. 他の誰かがそれらを使用する場合、それらの実装と非常にローカライズされた利点を理解していますが、実際にそれらを簡潔に説明することは非常に困難です. 誰でも私を助けることができますか?そして、おそらく私の例を拡張して、その利点を実際に示してください。