Scala foldLeft on Maps
Solution 1
If you want to use the (a, (k, v))
syntax, you need to advise the compiler to use pattern matching.
Map("first"->1, "second"->2).foldLeft(0){ case (a, (k, v)) => a+v }
Note that a case
statement requires curly braces.
Solution 2
I think, you can't do the pattern match on tuples as you expect:
Map("first"->1,"second"->2).foldLeft(0)((a, t) => a + t._2)
Actually, using values and sum is simpler.
Map("first"->1,"second"->2).values.sum
Solution 3
The trick is to use a partial function as the code block, in other words you add a case
statement that matches on the arguments:
Map("first" -> 1, "second" -> 2).foldLeft(0) { case (a, (k, v)) => a + v }
Solution 4
This is not really an answer to your question but I found it useful when starting out with folds, so I'll say it anyway! Note that the /:
method "alias" for foldLeft
can be clearer for two reasons:
xs.foldLeft(y) { (yy, x) => /* ... */ }
(y /: xs) { (yy, x) => /* ... */ }
Note that in the second line:
- it's more clear that the value
y
is being folded into the collectionxs
- you can easily remember the ordering of the
Tuple2
argument is the same as the ordering of the method "call"
Pengin
Updated on December 16, 2020Comments
-
Pengin over 3 years
How do you use Map.foldLeft? According to the docs it looks like
foldLeft [B] (z: B)(op: (B, (A, B)) ⇒ B) : B
But I'm having difficulty:
Map("first"->1,"second"->2).foldLeft(0)((a,(k,v)) => a+v )
error: not a legal formal parameter
The error points to the open bracket in front of k.
-
Daniel C. Sobral over 13 yearsHe can pattern match on tuples. To pattern match, though, one needs to use
case
. -
Thomas Jung over 13 years@Daniel That's the advantage of my lawyer-like sentence: it's correct (he cannot pattern-match as he expected) but I've forgotten the case syntax.
-
Kevin Wright over 13 yearsFor problems like this though, using
values
ormapValues
is absolutely the clearest solution (which will almost always make it the right choice) -
ron_ron almost 4 yearsWhy is pattern matching required? Are there any other patterns which can be matched for in a foldLeft ?
-
NikolaS almost 2 yearsThank you sooo much Theo! This is what I've been looking for a while...but how can
case
be used withoutmatch
keyword and how come is it being used as destructing action?