Afin de consolider le concept de l'utilisation implicite pour moi-même, j'ai écrit un exemple qui ne nécessite pas de scala 2.8, mais utilise le même concept. J'ai pensé qu'il pourrait être utile pour certains.
Tout d'abord, vous définissez un des génériques de la classe abstraite Addable:
scala> abstract class Addable[T]{
| def +(x: T, y: T): T
| }
defined class Addable
Maintenant, vous pouvez écrire à l' ajout de la fonction comme ceci:
scala> def add[T](x: T, y: T)(implicit addy: Addable[T]): T =
| addy.+(x, y)
add: [T](T,T)(implicit Addable[T])T
Il est utilisé comme un type de classe en Haskell. Alors pour réaliser cette classe générique pour un type spécifique, vous devez écrire(des exemples ici pour Int, Double et String):
scala> implicit object IntAddable extends Addable[Int]{
| def +(x: Int, y: Int): Int = x + y
| }
defined module IntAddable
scala> implicit object DoubleAddable extends Addable[Double]{
| def +(x: Double, y: Double): Double = x + y
| }
defined module DoubleAddable
scala> implicit object StringAddable extends Addable[String]{
| def +(x: String, y: String): String = x concat y
| }
defined module StringAddable
À ce stade, vous pouvez appeler l' ajout de la fonction avec les trois types:
scala> add(1,2)
res0: Int = 3
scala> add(1.0, 2.0)
res1: Double = 3.0
scala> add("abc", "def")
res2: java.lang.String = abcdef
Certainement pas aussi beau que Haskell qui va essentiellement faire tout cela pour vous. Mais, c'est là que le compromis se trouve.