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

mogę zrobićkrotnie lista krotek w Scala z demontażu struktury

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

Ale chcę, aby móc wymienić elementy krotki za. Coś jak:

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

wiem, że mogę zrobić:

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

Ale czy istnieje sposób dokonywania kod bardziej zwięzły (mój prawdziwy kod obejmuje kilka takich fałd i nie lubię konieczności wymyślić nazwę zmiennej ('i' w powyższym przykładzie) dla każdego)

Odpowiedz

15

spróbuj tego:

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

Note że oprócz Waltera odpowiedź, można użyć podkreślenia _ zamiast c w meczu Wzór:

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

działa jako coś pójdzie zastępczy we wzorcu Tuple2 i (moim zdaniem) czyni go jaśniejsze, że w rzeczywistości nie używasz wartości w swoich obliczeniach.

Również w 2,8 byłbyś w stanie zrobić:

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