scala sum数值列表

时间:2017-10-13 18:05:18

标签: scala

我想要一个通用函数来对列表中的值求和。

以下代码无法编译:

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

3 个答案:

答案 0 :(得分:6)

此错误告诉您已指定返回类型为T,但您总是为0返回一个空列表,即Int。如果传入列表包含其他内容,即TDouble还是某些自定义类型,该怎么办?试试这个:

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)