2010-11-14 2 views
25

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

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

Но я с трудом:

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

error: not a legal formal parameter

Точки ошибок в открывающей скобки перед к.

ответ

66

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

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

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

16

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

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

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

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

Он _can_ матч шаблон кортежей. Однако для соответствия шаблону нужно использовать 'case'. –

+0

@ Даниэль Это преимущество моего адвокатского предложения: это правильно (он не может сопоставлять шаблоны, как и ожидал), но я забыл синтаксис дела. –

+1

Для таких проблем, хотя использование 'values' или' mapValues' является абсолютно четким решением (которое почти всегда сделает его правильным выбором) –

5

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

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

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

Следует отметить, что во второй строке:

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

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

Map("first" -> 1, "second" -> 2).foldLeft(0) { case (a, (k, v)) => a + v } 
Смежные вопросы