Scala使用元组进行折叠操作

3
val g = List(1,2,3)

val k = g.fold((0,0))((a:Tuple2[Int,Int],b:Int)=>(a._1+b,a._2+1))

但是我收到以下错误信息 =
found   : ((Int, Int), Int) => (Int, Int)
 required: (Any, Any) => Any
              g.fold((0,0))((a:Tuple2[Int,Int],b:Int)=>(a._1+b,a._2+1))

请问为什么它期望一个“任意”类型。

但以下内容有效:

g.map((_,1))

g.map((_,1)).fold((0,0))((a,b)=> (a._1+b._1,a._2+b._2))
res211: (Int, Int) = (6,3)
2个回答

10

看起来你想使用foldLeft

val k = g.foldLeft((0,0))((a:Tuple2[Int,Int],b:Int)=>(a._1+b,a._2+1))

fold的签名为:

def fold[A1 >: A](z: A1)(op: (A1, A1) ⇒ A1): A1 

因此,它要求元素类型与累加器类型匹配,而您的示例对两者具有不同的类型。


0

具体回答这部分:

有人能解释一下,为什么它期望一个“Any”类型吗?

李的答案给出了签名:fold[A1 >: A](z: A1)(op: (A1, A1) ⇒ A1): A1。在你的情况下,编译器知道AInt,并且你将(0,0)作为z传递,它的类型是(Int, Int)。因此,A1必须是Int(Int, Int)的超类型。Any是它们的最小上界。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接