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是否转换为FunctionN或PartialFunction.
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)