Scala参数化方法和算术运算

Dan*_*ain 3 scala

我试图获得一个简单的功能,我有一个列表列表,我想对数据( - ,+,*,/)做一些数学运算.我希望该方法采用以下任何类型(Int,Float,Double).

这是我尝试过的:

def doSomething[T](data: List[T]){
 data reduceLeft(_ / _)
}
Run Code Online (Sandbox Code Playgroud)

显示以下内容:value /不是类型参数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 (_+_)
Run Code Online (Sandbox Code Playgroud)

并得到错误:类型不匹配; 发现:a._1.type(底层类型为T)需要:T

有没有办法解决这个问题?

feh*_*ehu 9

对于师:

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(_, _))}
Run Code Online (Sandbox Code Playgroud)

对于+, -和*它(更容易plus,minus,times分别对应).

def foo[T](l: List[T])(implicit num: Numeric[T]) = l reduceLeft (num.plus(_, _))
Run Code Online (Sandbox Code Playgroud)

  • 应该提到的是,你在这里看到的通常被称为"(隐式)类型类模式".参见例如http://java.dzone.com/articles/scala-implicits-type-classes (2认同)