2009-11-09 14 views
9
scala> val l = List((1,2), (2,3)) 
l: List[(Int, Int)] = List((1,2), (2,3)) 

posso farelista piega di tuple a Scala con la destrutturazione

scala> (0 /: l) {(a, i) => i._1 + a} 
res20: Int = 3 

Ma io voglio essere in grado di nominare gli elementi della tupla. Qualcosa di simile:

scala> (0 /: l) {(a, (b,c)) => b + a} 
<console>:1: error: not a legal formal parameter 
     (0 /: l) {(a, (b,c)) => b + a} 
        ^

so che posso fare:

scala> (0 /: l) {(a, i) => val (b, c) = i; b + a} 
res0: Int = 3 

Ma c'è un modo per rendere il codice più conciso (il mio codice vero e proprio coinvolge diversi tali pieghe e non mi piace dover inventare un nome di variabile ('i' nell'esempio di cui sopra) per ciascuno)

risposta

15

dare una prova:

(0 /: l) { case (a, (b, c)) => b + a } 
4

Nota che, oltre alla risposta di Walter, è possibile utilizzare il carattere di sottolineatura _ anziché c nel match modello:

val i = (0 /: l) { case (a, (b, _)) => b + a } 

Esso agisce come un qualcosa va segnaposto nel modello Tuple2 e (a mio avviso) rende più chiaro che in realtà non si utilizza il valore nel calcolo.

Inoltre 2,8 si sarebbe in grado di fare:

val i = l.map(_._1).sum