Как вы используете Map.foldLeft?В соответствии с документами это выглядит как
foldLeft [B] (z: B)(op: (B, (A, B)) ⇒ B) : B
Но у меня возникли трудности:
Map("first"->1,"second"->2).foldLeft(0)((a,(k,v)) => a+v ) ошибка: не является допустимым формальным параметром
Map("first"->1,"second"->2).foldLeft(0)((a,(k,v)) => a+v )
ошибка: не является допустимым формальным параметром
Ошибка указывает на открытую скобку перед k.
Если вы хотите использовать синтаксис (a, (k, v)), вам нужно посоветовать компилятору использовать сопоставление с образцом.
(a, (k, v))
Map("first"->1, "second"->2).foldLeft(0){ case (a, (k, v)) => a+v }
Обратите внимание, что для оператора case требуются фигурные скобки.
case
Я думаю, вы не можете выполнить сопоставление с образцом для кортежей, как вы ожидаете:
Map("first"->1,"second"->2).foldLeft(0)((a, t) => a + t._2)
На самом деле, использовать значения и суммы проще.
Map("first"->1,"second"->2).values.sum
Хитрость заключается в использовании частичной функции в качестве блока кода, другими словами, вы добавляете оператор case, который соответствует аргументам:
Map("first" -> 1, "second" -> 2).foldLeft(0) { case (a, (k, v)) => a + v }
Это не совсем ответ на ваш вопрос, но я нашел его полезным, когда начинаю со сгибов, так что я все равно скажу!Обратите внимание, что /: метод "псевдоним" для foldLeft может быть понятнее по двум причинам:
/:
foldLeft
xs.foldLeft(y) { (yy, x) => /* ... */ } (y /: xs) { (yy, x) => /* ... */ }
Обратите внимание, что во второй строке:
y
xs
Tuple2