意外的Scala模式匹配语法

Mar*_*sco 8 syntax scala pattern-matching

我有一个Scala元组列表,如下所示:

val l = List((1,2),(2,3),(3,4))
Run Code Online (Sandbox Code Playgroud)

我希望将它映射到Int列表中,其中每个项目是相应元组中Ints的总和.我也不想使用x._1表示法,所以我用这样的模式匹配解决了问题

def addTuple(t: (Int, Int)) : Int = t match { 
    case (first, second) => first + second 
}
var r = l map addTuple
Run Code Online (Sandbox Code Playgroud)

这样做我按预期获得了列表r:List [Int] = List(3,5,7).在这一点上,几乎是偶然的,我发现我可以使用如下的缩写形式获得相同的结果:

val r = l map {case(first, second) => first + second}
Run Code Online (Sandbox Code Playgroud)

我在我的文档中找不到对此语法的任何引用.这是正常的吗?我错过了一些微不足道的事情吗?

ret*_*nym 19

请参见语言参考的第8.5节"模式匹配匿名函数".

匿名函数可以由一系列案例定义

{case p1 =>b1 ... case pn => bn }

它显示为没有先前匹配的表达式.必须部分地定义这种表达式的预期类型.它必须是scala.Functionk[S1, ..., Sk, R]某些k> 0,或者必须完全确定scala.PartialFunction[S1, R]参数类型S1, ..., Sk,但结果类型R可能未确定.

期望的类型deternines是否转换为FunctionNPartialFunction.

scala> {case x => x}  
<console>:6: error: missing parameter type for expanded function ((x0$1) => x0$1 match {
  case (x @ _) => x
})
       {case x => x}
       ^

scala> {case x => x}: (Int => Int)
res1: (Int) => Int = <function1>

scala> {case x => x}: PartialFunction[Int, Int]
res2: PartialFunction[Int,Int] = <function1>
Run Code Online (Sandbox Code Playgroud)