Map
このコンテキストでは、 a をタプルのリストと考えることができます。次のようなリストを作成し、それList(1 -> 2.0, 3 -> 4.0, 5 -> 6.2)
を呼び出すことができますfoldLeft
(これは多かれ少なかれ正確に何をするかMap.foldLeft
です)。リストの仕組みを理解すればfoldLeft
、マップの仕組みも理解できます:) 具体的な質問に答えるには:
の最初のパラメーターはfoldLeft
、任意の型にすることができます。最初の例でもMap
、 an の代わりに a を渡すことができます。Int
最初の例のように、処理しているコレクションの要素と同じタイプである必要はありません (ただし、そうである可能性があります)。また、コレクション自体と同じタイプである必要もありません。最後の例でそれを持っています。例のためにこれを考えてみましょう:
List(1,2,3,4,5,6).foldLeft(Map.empty[String,Int]) { case(map,elem) =>
map + (elem.toString -> elem)
}
と同じ結果になりlist.map { x => x.toString -> x }.toMap
ます。ご覧のとおり、ここの最初のパラメーターは でありMap
、どちらList
でもありませんInt
。
渡すfoldLeft
型はそれが返す型でもあり、渡す関数が返す型でもあります。「エレメントゼロ」ではありません。
foldLeft
リストの最初の要素とともに、そのパラメーターをレデューサー関数に渡します。関数は 2 つの要素を結合し、最初のパラメーターと同じ型の新しい値を生成します。その値は、再び 2 番目の要素で渡されます...など。おそらく、の署名を調べるfoldLeft
と役立つでしょう:
foldLeft[B](z: B)(op: (B, A) ⇒ B): B
これはあなたA
のコレクション要素のタイプであり、B
何でもかまいません。唯一の要件は、表示される 4 つの場所が同じタイプであることです。
別の例を次に示します。これは (ほぼ) と同等list.mkString(",")
です。
List(1,2,3,4,5,6).foldLeft("") {
case("", i) => i.toString
case(s,i) => s + "," + i
}
最初に説明したように、このコンテキストでのマップは一種のリスト (むしろシーケンス) です。リストを扱ったときに「常にリストの次の要素を取得した」ように、この場合は「マップの次の要素」を取得します。あなたはそれを自分で言いました、マップの要素はタプルなので、次の要素の型は次のようになります:
Map("one" -> 1, "two" -> 2, "three" -> 3)
.foldLeft("") {
case("", (key,value)) => key + "->" + value
case(s, (key,value)) => s + ", " + key + "->" + value
}