将Int还原为单个Int很好:
val input = List(3, 5, 7, 11)
def op(total: Int, cur: Int) = total + cur//> op: (total: Int, cur: Int)Int
input reduce op 但是当我尝试连接字符串时:
def op(total: String, cur: String) = (total + cur) //> op: (total: Int, cur: Int)Int
val input = List(3, 5, 7, 11)
input reduce op导致编译器错误:类型不匹配;找到:(字符串,字符串)需要的=>字符串:(任意,任何) => Any
字符串不是类型的吗?
发布于 2014-01-09 11:03:42
根本原因
您有一个函数,接受String并重放String,然后尝试用整数填充它。您需要从字符串到整数的某种转换(显式或隐式)。
错误信息
编译器知道,为reduce提供的函数必须接受一个值为一个类型(两个元素的类型相同)的对,并返回一个相同类型的值。当输入整数和期望字符串时,此类型只能是任意类型。
但是您的函数是(String, String) => String类型的。这不能映射到(Any, Any) => Any。返回值不是问题,因为字符串总是可以被抛出给任何一个。但是这个参数是个问题:并不是每一个任何一个都可以被抛到一个字符串中。
解决方案
将您的值转换为字符串。
val input = List(3, 5, 7, 11).map(_.toString)或添加隐式转换函数。
implicit def lint2lstr : List[Int] => List[String] = _.map(_.toString)然后,编译器将在您定义
val input : List[String] = List(3, 5, 7, 11)发布于 2014-01-09 10:42:39
不能将input集合(Ints)的元素传递给接受Strings的函数。
请参见reduce方法的声明:
def reduce[A1 >: A](op: (A1, A1) => A1): A1A这里是元素的类型(在您的例子中,A是Int)。
A1应该是A的超级类型。
Any是Int的超级类型,但String不是Int的超级类型。
实际上,编译器错误并不完全正确,需要任何函数(A1, A1) => A1,例如A1是A的超级类型(在您的例子中,A是Int)。
还请注意,(String, String) => String不是(Any, Any) => Any的子类型,因此不能在需要(Any, Any) => Any的地方使用(String, String) => String。
发布于 2014-01-09 10:53:38
这里的input是List[Int]类型的
列表的reduce方法有以下声明
def reduce[A1 >: A](op: (A1, A1) => A1): A1基本上,这意味着reduce用于List[A]接受(A1, A1) => A1类型的运算符,并返回A1类型,其中A1是A的超级类型。在您的例子中,A1必须是Int或它的超级类型。
这是因为reduce工作是通过在项上连续应用操作符来完成的。即。前两项的运算符的结果与下一项一起使用。这意味着操作符函数声明应该使相同的函数能够接受它产生的结果以及列表中的项。
https://stackoverflow.com/questions/21017821
复制相似问题