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.
Ответы
Ответ 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
- это то же самое, что и порядок вызова метода