2010-09-16 183 views
8

我有斯卡拉的列表元組類似如下:意外Scala的模式匹配語法

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

,我想把它映射爲int的列表,其中每個項目是int型的相應總和元組。我也不想用就用的x._1符號,所以我解決了這個問題與模式匹配這樣

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

這樣做,我得到的名單R:列表[INT] =一覽(3, 5,7)如預期。在這一點上,幾乎是在偶然中,我發現,我可以像下面的縮寫形式達到相同的結果:

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

我找不到這個語法我的文檔中的任何引用。這是正常的嗎?我錯過了一些微不足道的東西嗎?

+0

這個語法很好,但對於這樣的事情,我更喜歡l.map(t => t._1 + t._2)。我認爲x._1語法沒有錯誤 – Landei 2010-09-17 08:28:02

回答

19

請參閱語言參考的第8.5節「模式匹配匿名函數」。

匿名函數可通過表現爲沒有前一次匹配的表達情況

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

的序列來定義。這種表達的預期類型必須部分被定義。對於某些k> 0或scala.PartialFunction[S1, R],它必須是scala.Functionk[S1, ..., Sk, R],其中參數類型S1, ..., Sk必須完全確定,但結果類型R可能未確定。

預期類型是否將其轉換爲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> 
1

方法map接受函數。在你的第一個例子中,你創建一個函數,將它分配給一個變量,並將它傳遞給map方法。在第二個示例中,您直接傳遞您創建的函數,省略將其分配給一個變量。你正在做同樣的事情。

+0

不準確。在第一個例子中,定義了*方法*'addTuple'。然後,編譯器使用* partial application *生成一個等價函數,該函數被傳遞給在'l'上調用的'map'方法。 – 2010-09-17 00:38:52