我有一个元组的载体
val l = for {i <- 1 to 5} yield (i,i*2)
Vector((1,2), (2,4), (3,6), (4,8), (5,10))
我想以下列方式加以总结:
l.reduce((x,y) => (x._1+y._1, x._2+y._2))
(15,30)
但使用模式匹配。
如果函数只获得一个参数,我知道怎么做,即:l.map({case(a,b)=>a+b})
,但是我无法使用两个参数。这就是我试图做的事情:
l.reduce({(case(a,b),case(c,d))=>(a+c,b+d)})
但这不起作用。
所以我的问题是,如何解包作为函数参数出现的2个元组?
答案 0 :(得分:6)
只需明确指定类型以帮助部分函数机制:
l.reduce[(Int, Int)]{ case ((a,b), (c, d)) => (a + b, c + d)}
如果没有[(Int, Int)]
scala,则无法推断出部分函数的正确类型
P.S。如果您正在查看关于String
的错误的原因,无论您实际使用的是什么类型(在您的情况下为Int
):
found : Any ,
required: String
那是因为隐含的&#34; +&#34;对于Predef
中的字符串。这不是唯一隐含的问题 - 您可以查看SI-194。
即使没有:
l.reduce{ case ((a,b), (c, d)) => (a, d)}
The argument types of an anonymous function must be fully known. (SLS 8.5)
Expected type was: (?, ?) => ?
scala无法推断出类型,因为它无法推断出部分函数的类型 - 可能是任何超类型的Int:(A1, A1) => A1
,[A1 >: A]
答案 1 :(得分:2)
你写了类似于部分功能定义的东西。我不确定这是不是你的意图。这有效:
l.reduce((x,y) => (x, y) match {
case ((a,b), (c,d)) => (a+c, b+d)
})