web-dev-qa-db-ja.com

ScalaマップのfoldLeft

Map.foldLeftをどのように使用しますか? docs によると、

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

しかし、私は問題を抱えています:

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

エラー:正式な仮パラメータではありません

エラーは、kの前の開き角かっこを指します。

34
Pengin

(a, (k, v))構文を使用する場合は、パターンマッチングを使用するようコンパイラーに指示する必要があります。

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

caseステートメントには中括弧が必要です。

81
Debilski

あなたが期待するようにタプルでパターンマッチを行うことはできないと思います:

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

実際には、値と合計を使用する方が簡単です。

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

トリックは、コードブロックとして部分関数を使用することです。つまり、引数に一致するcaseステートメントを追加します。

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

これは実際にはあなたの質問に対する答えではありませんが、折り目から始めるときに役立つので、とにかく言います! foldLeft/:メソッド「エイリアス」は、次の2つの理由により明確になる場合があることに注意してください。

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

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

2行目に注意してください。

  • yfolded intoコレクションxsであることはより明確です
  • Tuple2引数の順序は、メソッド「call」の順序と同じであることを簡単に覚えることができます。
5
oxbow_lakes