2009-11-09 2 views
9
scala> val l = List((1,2), (2,3)) 
l: List[(Int, Int)] = List((1,2), (2,3)) 
уничтожения того

я могу сделатьраза список кортежей в Скале с

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

Но я хочу, чтобы быть в состоянии назвать элементы кортежа. Что-то вроде:

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

Я знаю, что я могу сделать:

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

Но есть способ сделать код более кратким (мой реальный код включает в себя несколько таких складок, и я не люблю необходимости придумать имя переменной («я» в приведенном выше примере) для каждого)

ответ

15

Дайте это попробовать:

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

Примечание что, в дополнение к ответу Уолтера, вы можете использовать подчеркивание _ вместо c в матче картины:

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

Он действует как нибудь идет заполнитель в Tuple2 шаблон и (на мой взгляд) делает его что вы фактически не используете значение в своем расчете.

Кроме того, в 2.8 вы могли бы сделать:

val i = l.map(_._1).sum 
Смежные вопросы