2010-09-16 12 views
8

miałem Lista Scala krotki jak następuje:Nieoczekiwany wzór Scala dopasowanie składni

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

i chciałem mapować go na liście Int gdzie każdy element jest sumą Ints w sposób odpowiadający krotka. Ja też nie chcą używać używać notacji x._1 więc rozwiązać problem z wzorzec dopasowania się ten

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

Doing że uzyskał listy R: List [Int] = List (3, 5, 7) zgodnie z oczekiwaniami. W tym momencie, prawie przez przypadek odkryłem, że mogę osiągnąć ten sam rezultat w skróconej formie jak poniżej:

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

nie mogę znaleźć żadnego odniesienia do tej składni w dokumentacji mam. Czy to normalne? Czy brakuje mi czegoś trywialnego?

+0

Ta składnia jest dobra, ale dla takich rzeczy jak ja wolę l.map (t => t._1 + t._2). Myślę, że nie ma nic złego w składni x._1 – Landei

Odpowiedz

19

Patrz punkt 8.5 odnośnika językowego "Anonimowe funkcje pasujące do wzorca".

anonimowy funkcja może być zdefiniowana przez sekwencję przypadków

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

, które pojawiają się jako wyrażenie bez uprzedniego meczu. Oczekiwany typ takiego wyrażenia musi być częściowo zdefiniowany. Musi to być scala.Functionk[S1, ..., Sk, R] dla niektórych k> 0 lub scala.PartialFunction[S1, R], gdzie typ argumentu (ów) S1, ..., Sk musi być w pełni określony, ale typ wyniku R może być nieokreślony.

Oczekiwany typ powoduje, że zostanie on przetłumaczony na FunctionN lub 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

Metoda map akceptuje funkcję. W pierwszym przykładzie tworzysz funkcję, przypisujesz ją do zmiennej i przekazujesz do metody map. W drugim przykładzie przekazujesz bezpośrednio utworzoną funkcję, pomijając przypisanie jej do zmiennej. Robisz dokładnie to samo.

+0

Nie dokładnie. W pierwszym przykładzie zdefiniowana jest * metoda * 'addTuple'. Następnie kompilator używa * częściowej aplikacji * do wygenerowania równoważnej funkcji, która jest przekazywana do metody 'map' wywoływanej na' l'. –

Powiązane problemy