代码之家  ›  专栏  ›  技术社区  ›  Mario Fusco

意外的Scala模式匹配语法

  •  8
  • Mario Fusco  · 技术社区  · 16 年前

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

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

    我想把它映射到一个Int列表中,其中每一项都是对应元组中Int的和。我也不想使用x.\\u 1符号,所以我用这样的模式匹配解决了这个问题

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

    这样,我得到了list r:list[Int]=list(3,5,7),正如预期的那样。在这一点上,几乎是偶然的,我发现我可以用下面的缩写形式达到同样的结果:

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

    在我的文档中找不到任何关于这个语法的引用。这正常吗?我是不是错过了一些小事?

    3 回复  |  直到 16 年前
        1
  •  19
  •   retronym    16 年前

    参见语言参考的第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>
    
        2
  •  4
  •   Alexey Romanov    16 年前

    {case(first, second) => first + second} 被视为 PartialFunction http://programming-scala.labs.oreilly.com/ch08.html 或第15.7节 Scala编程 .

        3
  •  1
  •   George    16 年前

    map 接受函数。在第一个示例中,创建一个函数,将其赋给一个变量,然后将其传递给 方法。在第二个示例中,直接传递创建的函数,而忽略将其赋给变量。你在做同样的事情。