Подтвердить что ты не робот

Scala foldLeft на картах

Как вы используете Map.foldLeft? Согласно docs, он выглядит как

foldLeft [B] (z: B)(op: (B, (A, B)) ⇒ B) : B

Но у меня возникают трудности:

Map("first"->1,"second"->2).foldLeft(0)((a,(k,v)) => a+v )

error: не формальный формальный параметр

Ошибка указывает на открытую скобку перед k.

4b9b3361

Ответ 1

Если вы хотите использовать синтаксис (a, (k, v)), вам необходимо сообщить компилятору, чтобы использовать сопоставление с образцом.

Map("first"->1, "second"->2).foldLeft(0){ case (a, (k, v)) => a+v }

Обратите внимание, что для оператора case требуются фигурные скобки.

Ответ 2

Я думаю, вы не можете выполнить сопоставление шаблонов по кортежам, как вы ожидаете:

Map("first"->1,"second"->2).foldLeft(0)((a, t) => a + t._2)

Фактически, использование значений и суммы проще.

Map("first"->1,"second"->2).values.sum

Ответ 3

Хитрость заключается в использовании частичной функции в качестве кода, другими словами, вы добавляете оператор case, который соответствует аргументам:

Map("first" -> 1, "second" -> 2).foldLeft(0) { case (a, (k, v)) => a + v }

Ответ 4

На самом деле это не ответ на ваш вопрос, но я сочла это полезным, когда начинал с складок, поэтому я все равно скажу! Обратите внимание, что метод /: "псевдоним" для foldLeft может быть более четким по двум причинам:

xs.foldLeft(y) { (yy, x) => /* ... */ }

(y /: xs) { (yy, x) => /* ... */ }

Обратите внимание, что во второй строке:

  • более ясно, что значение y складывается в коллекцию xs
  • Вы легко можете запомнить порядок аргумента Tuple2 - это то же самое, что и порядок вызова метода