, . - :
trait Add[A] {
def apply(a: A, b: A): A
}
object Add {
implicit val booleanAdd: Add[Boolean] = new Add[Boolean] {
def apply(a: Boolean, b: Boolean): Boolean = !a
}
implicit def numericAdd[A: Numeric]: Add[A] = new Add[A] {
def apply(a: A, b: A): A = implicitly[Numeric[A]].plus(a, b)
}
}
Add[X] , X. "" Add[X] X, . Boolean , scala.math.Numeric ( , ). Int Double, numericAdd Add[Int] Add[Double].
fun :
def fun[T: Add](x: T, y: T) = implicitly[Add[T]].apply(x, y)
:
scala> fun(true, false)
res0: Boolean = false
scala> fun(1, 2)
res1: Int = 3
scala> fun(0.01, 1.01)
res2: Double = 1.02
: , . , MatchError , . fun, :
scala> fun("a", "b")
<console>:14: error: could not find implicit value for evidence parameter of type Add[String]
fun("a", "b")
^
"" (.. , case x: X => ...) - Scala, . .