Свернуть список кортежей в Scala с деструктуризацией - PullRequest
9 голосов
/ 09 ноября 2009
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

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

Ответы [ 2 ]

18 голосов
/ 09 ноября 2009

Попробуйте:

(0 /: l) { case (a, (b, c)) => b + a }
4 голосов
/ 09 ноября 2009

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

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

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

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

val i = l.map(_._1).sum
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...