Экземпляр Numeric
не является самим числом, но это объект, который предлагает операции для выполнения арифметики.Например, объект num
типа Numeric[Int]
может добавить два целых числа, например: num.plus(3, 5)
Результатом этой операции является целое число 7.
Для целых чисел это очень тривиально.Однако для всех базовых числовых типов доступен один неявный экземпляр Numeric
.И если вы определяете свои собственные числовые типы, вы можете предоставить один из них.
Поэтому вы должны оставить открытыми границы для A
и добавить неявный параметр типа Numeric[A]
, с помощью которого вы выполняете вычисления.Вот так:
def **[A](l:List[A],m:List[A])(implicit num:Numeric[A])=l.zip(m).map({t=>num.times(t._1, t._2)})
Конечно, num.times(a,b)
выглядит менее элегантно, чем a*b
.В большинстве случаев с этим можно жить.Однако вы можете обернуть значение a
в объект типа Ops
, который поддерживает операторы, например:
// given are: num:Numeric[A], a:A and b:A
val a_ops = num.mkNumericOps(a)
val product = a_ops * b
Так как метод mkNumericOps
объявлен implicit
, вы также можете импортироватьэто и использовать его неявно:
// given are: num:Numeric[A], a:A and b:A
import num._
val product = a * b