2017-06-08 25 views
1

私は、型のクラスパターンとScalaの暗黙のクラスの間のユースケースの違いを理解するのに苦労しています。私にとって混乱を招くのは、どちらもScalaで特別なポリモーフィズムを提供していることです。クラスパターンと暗黙のクラス

私の質問です。彼らは同じ問題を解決しているのですか、またはユースケースに明確な違いがありますか?

+0

多型 - 1つの関数、複数型* s。暗黙のクラスでは、1つの型だけを豊かにします。 –

+0

ジェネリッククラスを使用してみませんか? – user3139545

答えて

9

違いがあります。

暗黙のクラスは、通常、既存の型に拡張メソッドを提供するために使用されています

implicit class IntExt(val x: Int) extends AnyVal { 
    def squared: Int = x * x 
} 

10.squared shouldEqual 1000 

彼らが実際にアドホック多型を提供していません。既存の型に対して新しいメソッドを定義することができます。

型クラスは、他の一方で、別の暗黙的な機構(暗黙的なクラスの場合には暗黙的な変換対暗黙のパラメータ)に依存し、それらは、アドホック多型の機構である。ため

trait Show[T] { 
    def show(x: T): String 
} 

implicit val intHexShow: Show[Int] = new Show[Int] { 
    override def show(x: Int): String = Integer.toHexString(x) 
} 

implicit val stringReverseShow: Show[String] = new Show[String] { 
    override def show(x: String): String = x.reverse 
} 

def showPrint[T](value: T)(implicit s: Show[T]): Unit = { 
    println(s.show(value)) 
} 

showPrint(12) // prints "c" 
showPrint("hello") // prints "olleh" 

特定の型の型クラスの実装で定義された "振る舞い"をパラメータとして受け入れる場合、それは確かにアドホック多型のケースです。型クラスは、JSONのエンコーディング/デコード、モナドやアプリケーションのような関数構造、型多型関数など、Scalaの多くのものに使用されています。ほとんどの場合、既存の型に新しい動作を汎用的に追加する必要がある場合は、型クラスが発生します。

+0

あなたの重複するケースについていくつか説明できますか? – user3139545

+0

私は個人的には重複するかどうかわかりません。それらは異なるもののために使用され、異なる実装メカニズムを持っています。例えば、catやscalaz暗黙クラスのようなライブラリでは、特定の型クラスが実装されている型に新しいメソッドを追加するために使用されます(例えば、 'Traverse'インスタンスを持つ型の' sequence'メソッド)それ以外の場合は直接接続しません。少なくとも、私はそれを知らないので、私はかなりの時間Scalaで作業しました。具体的な例があれば、私はそれを説明しようとすることができます。 –

関連する問題