すごいHaskell本の序盤に次のような関数が出てくる。この関数はxが整数でも浮動小数点数でも動く。
doubleMe x = x + x
ScalaでもNumeric型クラスをつかうことで同じように振る舞える。
def doubleMe[A](x: A)(implicit num: Numeric[A]): A = num.plus(x, x)
型クラスのインスタンスにしてしまえばどんな型にも対応できる。たとえば…
implicit val numericString = new Numeric[String] {
def plus(x: String, y: String): String = x + y
def minus(x: String, y: String): String = x - y
def times(x: String, y: String): String = x * y
def negate(x: String): String = s"-$x"
def toInt(x: String): Int = 0
def toLong(x: String): Long = 0
def toFloat(x: String): Float = 0
def toDouble(x: String): Double = 0
def fromInt(x: Int): String = x.toString
def compare(x: String, y: String): Int = x compare y
}
doubleMe("a") // String = "aa"