Scala параметризованные методы и арифметические операции
Я пытаюсь получить простую функциональность для работы, где у меня есть список списков, и я хочу сделать некоторые математические операции над данными (-, +, *,/). Я хочу, чтобы метод использовал любой из следующих типов (Int, Float, Double).
вот что я пробовал:
def doSomething[T](data: List[T]){
data reduceLeft(_ / _)
}
отображается следующее: значение/не является членом параметра типа T.
Как мне заставить это работать для типов AnyVal (Double, Int, Float)?
Обновление Я попытался реализовать предложение в следующем коде:
def dot[T](l: List[List[T]])(implicit num: Numeric[T]) =
{
for (row <- data)
yield for(col <- l)
yield row zip col map {a => num.times(a._1 , a._2)} reduceLeft (_+_)
и получить ошибку: type mismatch; найдено: a._1.type(с базовым типом T): T
Есть ли способ обойти это?
Ответы
Ответ 1
Для деления:
def foo[T](l: List[T])(implicit num: Numeric[T]) = num match{
case i: Integral[_] => l reduceLeft (i.quot(_, _))
case fr: Fractional[_] => l reduceLeft (fr.div(_, _))}
Для +, - и * это проще (plus
, minus
, times
соответственно):
def foo[T](l: List[T])(implicit num: Numeric[T]) = l reduceLeft (num.plus(_, _))