我想要一个通用函数来对列表中的值求和。
以下代码无法编译:
def sum[T : Numeric](x: List[T]): T = {
if(x.isEmpty) 0
else x.head + sum(x.tail)
}
编译错误是:
error: type mismatch;
[INFO] found : Int(0)
[INFO] required: T
[INFO] if(x.isEmpty) 0
答案 0 :(得分:6)
此错误告诉您已指定返回类型为T
,但您总是为0
返回一个空列表,即Int
。如果传入列表包含其他内容,即T
是Double
还是某些自定义类型,该怎么办?试试这个:
if(x.isEmpty) implicitly[Numeric[T]].zero
完整的工作方法:
def sum[T : Numeric](x: List[T]): T = {
if (x.isEmpty) implicitly[Numeric[T]].zero
else implicitly[Numeric[T]].plus(x.head, sum(x.tail))
}
或者:
def sum[T](x: List[T])(implicit num: Numeric[T]): T = {
import num._
if (x.isEmpty) zero
else x.head + sum(x.tail)
}
答案 1 :(得分:2)
试试这个:
def sum[T](x: List[T])(implicit num: Numeric[T]): T = x.foldLeft(num.zero)(num.plus)
答案 2 :(得分:1)
使用reduce
(如果您不想为sum设置初始值),否则请使用fold
操作:
def sumWithReduce[T](lst: List[T])(implicit numericType: Numeric[T]):T
= lst.reduce(numericType.plus)
def sumWithFold[T](lst: List[T])(implicit numericType: Numeric[T]):T
= lst.fold(numericType.zero)(numericType.plus)