web-dev-qa-db-fra.com

Scala refinblé sur les cartes

Comment utilisez-vous la carte.foldleft? Selon le docs On dirait

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

Mais j'ai des difficultés:

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

erreur: pas un paramètre formel légal

L'erreur indique le support ouvert devant k.

34
Pengin

Si vous voulez utiliser le (a, (k, v)) Syntaxe, vous devez conseiller le compilateur d'utiliser la correspondance des motifs.

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

Notez que une instruction case nécessite des accolades bouclées.

81
Debilski

Je pense que vous ne pouvez pas faire le match de modèle sur les tuples comme vous attendez:

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

En fait, l'utilisation de valeurs et de somme est plus simple.

Map("first"->1,"second"->2).values.sum
17
Thomas Jung

L'astuce consiste à utiliser une fonction partielle en tant que bloc de code, en d'autres termes, vous ajoutez une instruction case correspondant aux arguments:

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