为什么第1行和第2行有效,但是3失败?¿:
val sum1= (a: Int, b: Int, c: Int) => a + b + c //OK
List(1,2,3).reduceLeft(_+_) //OK
val sum2 =(x: List) =>x.reduceLeft(_+_) //Fail
答案 0 :(得分:1)
您必须将元素类型添加到x: List
,因此它会变为List[Int]
或List[Double]
。 List
本身是raw type
,在Scala中是非法的。如果没有类型注释,编译器也不知道+
部分中reduceLeft(_+_)
运算符的含义,因此必须产生错误。
答案 1 :(得分:0)
编译器缺少证明List
内的基础对象是定义+
运算符的类型。这是使用底层Scala lib定义一个能够添加任何数字类型List的方法的好方法。
为此,您甚至不需要reduce
,因为Scala已经定义了sum
。 List
是一种更高级的类型构造函数,更多详情here。
def addList[T : Numeric](list: List[T]): T = list.sum