我正在尝试让一个简单的功能在我有一个列表列表的情况下工作,并且我想对数据(-、+、*、/)进行一些数学运算。我希望该方法采用以下任何类型(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
有什么办法可以解决吗?
最佳答案
除法:
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(_, _))
关于Scala 参数化方法和算术运算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4709571/