Компилятор Scala не распознает границы представления - PullRequest
2 голосов
/ 14 декабря 2010

Я пробовал эту строку кода

def **[A <% Numeric[A]](l:List[A],m:List[A])=l.zip(m).map({t=>t._1*t._2})

Однако при компиляции я получаю эту ошибку

error: value * is not a member of type parameter A
def **[A <% Numeric[A]](l:List[A],m:List[A])=l.zip(m).map({t=>t._1*t._2})

Когда я смотрю на источник для числовой черты, я вижу определенную опцию *.

Что я делаю не так?

Ответы [ 2 ]

6 голосов
/ 14 декабря 2010

Экземпляр 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
2 голосов
/ 18 декабря 2010

Вы также можете решить это с помощью контекста . Используя context метод из этого ответа , вы можете написать:

def **[A : Numeric](l:List[A],m:List[A]) =
   l zip m map { t => context[A]().times(t._1, t._2) }

или

def **[A : Numeric](l:List[A],m:List[A]) = {
   val num = context[A]()
   import num._
   l zip m map { t => t._1 * t._2 }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...