Scala параметризованные методы и арифметические операции - PullRequest
3 голосов
/ 17 января 2011

Я пытаюсь заставить простой функционал работать там, где у меня есть список списков, и я хочу выполнить некоторые математические операции над данными (-, +, *, /).Я хочу, чтобы метод принимал любой из следующих типов (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 (_+_)

и получить ошибку: несоответствие типов;найдено: a._1.type (с базовым типом T) требуется: T

Есть ли способ обойти это?

1 Ответ

9 голосов
/ 17 января 2011

Для деления:

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(_, _))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...