38

Map.foldLeft はどのように使用しますか? ドキュメントによると、次のようになります

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

しかし、私は苦労しています:

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

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

エラーは、k の前の開き括弧を指しています。

4

4 に答える 4

89

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

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

caseステートメントには中括弧が必要であることに注意してください。

于 2010-11-14T18:10:51.293 に答える
18

期待どおりにタプルでパターンマッチを行うことはできないと思います:

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

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

Map("first"->1,"second"->2).values.sum
于 2010-11-14T17:47:03.517 に答える
6

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

Map("first" -> 1, "second" -> 2).foldLeft(0) { case (a, (k, v)) => a + v }
于 2010-11-14T20:52:47.130 に答える
5

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

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

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

2行目には次の点に注意してください。

  • 価値yがコレクションに組み込まれていることがより明確になりますxs
  • Tuple2引数の順序は、メソッド「call」の順序と同じであることを簡単に思い出すことができます。
于 2010-11-14T19:55:00.527 に答える