意外的Scala模式匹配语法

时间:2010-09-16 21:03:57

标签: scala syntax pattern-matching

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

val l = List((1,2),(2,3),(3,4))

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

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

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

val r = l map {case(first, second) => first + second}

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

3 个答案:

答案 0 :(得分:19)

参见语言参考的第8.5节“模式匹配匿名函数”。

  

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

     

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

     

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

预期类型会决定是将其转换为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>

答案 1 :(得分:4)

{case(first, second) => first + second}被视为PartialFunction字面值。请参阅此处“部分功能”部分中的示例:http://programming-scala.labs.oreilly.com/ch08.html Scala编程中的第15.7节。

答案 2 :(得分:1)

方法map接受一个函数。在第一个示例中,您将创建一个函数,将其分配给变量,并将其传递给map方法。在第二个示例中,您直接传递创建的函数,省略将其赋值给变量。你正在做同样的事情。