函数参数的模式匹配

时间:2014-10-07 16:34:20

标签: scala

我有一个元组的载体

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个元组?

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)
})