2017-03-21 9 views
1

"マップマップにマップ"、どのような一口。簡潔に地図を地図にどのように

とにかく、私が行うことができます。

val list = List(1, 2, 3) 
val list2 = list map (item => item + 1) 
println(list2) 
// List(2, 3, 4) 

なぜ次は?:

val ages = Map("alice" -> 21, "bob" -> 22) 
val ages2 = ages map ((name, age) => (name, age + 1)) 

機能しない、そしてどのように私はそれを動作することについて行くのですか?

EDIT: 私は私がしなければならなかったことを考え出し:

val ages2 = ages map {case (name, age) => (name, age + 1)} 

が、それは私の素朴な最初のアプローチが動作しない理由は、私の最初の質問は、お答えいたしません。

+3

これは問題ではないことは分かっていますが、 'Map'のキー部分を変更する必要がない場合は、(lazily)値に関数を適用する' mapValues'メソッドを使用することもできます。例えば、ここでは 'ages2.mapValues(_ + 1)'を実行できます。 –

+0

エラーメッセージを含めることは良い考えでした。正しい方向にあなたを指摘しているかもしれません –

答えて

4

MapにScalaコンパイラがTuple2(キー値のペアのタイプ)を自動的に分解しないため、動作しません。

これは動作します:

val ages2 = ages.map(pair => (pair._1, pair._2 + 1)) 

それが全体としてタプル引数を使用しているので。

あなたが気づいてきたように、また、部分関数の構文を使用して動作し、あなたが自動的にタプルに分解することができます:

val ages2 = ages map { case (name, age) => (name, age + 1) } 

これは、現在のコンパイラの制限です。 dotty(新しい新しいScalaコンパイラ)では、これはそのままで提供されます。