Scala foldLeft на Картах - PullRequest
       44

Scala foldLeft на Картах

31 голосов
/ 14 ноября 2010

Как вы используете Map.foldLeft?В соответствии с документами это выглядит как

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

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

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

ошибка: не является допустимым формальным параметром

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

Ответы [ 4 ]

75 голосов
/ 14 ноября 2010

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

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

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

17 голосов
/ 14 ноября 2010

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

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

На самом деле, использовать значения и суммы проще.

Map("first"->1,"second"->2).values.sum
6 голосов
/ 14 ноября 2010

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

Map("first" -> 1, "second" -> 2).foldLeft(0) { case (a, (k, v)) => a + v }
5 голосов
/ 14 ноября 2010

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

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

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

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

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