3

マップの仕組みを理解したいfoldLeft。リストがあり、ゼロ要素と関数で foldLeft を呼び出すと、それがどのように機能するかを理解しています。

val list1 = List(1,2,3)
list1.foldLeft(0)((a,b) => a + b)

0の最初の要素でゼロ要素をlist1追加し、次に の 2 番目の要素を追加list1します。したがって、出力は新しい入力になり、最初の入力はゼロ要素になります。

今、私はコードを手に入れました

val map1 = Map(1 -> 2.0, 3 -> 4.0, 5 -> 6.2) withDefaultValue 0.0
val map2 = Map(0 -> 3.0, 3 -> 7.0) withDefaultValue 0.0
def myfct(terms: Map[Int, Double], term: (Int, Double)): Map[Int, Double] = ???

map1.foldLeft(map2)(myfct)
  1. ここでの最初の要素は aTuple2ですが、map2は aMapであり ではないのでTuple2、ゼロ要素は何ですか?
  2. List、つまりがあるときはlist1、常に「次の要素を取りましたlist1」。の「次の要素はmap1何ですか?」の別のペアmap1ですか?
4

2 に答える 2

7

Mapこのコンテキストでは、 a をタプルのリストと考えることができます。次のようなリストを作成し、それList(1 -> 2.0, 3 -> 4.0, 5 -> 6.2)を呼び出すことができますfoldLeft(これは多かれ少なかれ正確に何をするかMap.foldLeftです)。リストの仕組みを理解すればfoldLeft、マップの仕組みも理解できます:) 具体的な質問に答えるには:

  1. の最初のパラメーターは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
   }
  1. 最初に説明したように、このコンテキストでのマップは一種のリスト (むしろシーケンス) です。リストを扱ったときに「常にリストの次の要素を取得した」ように、この場合は「マップの次の要素」を取得します。あなたはそれを自分で言いました、マップの要素はタプルなので、次の要素の型は次のようになります:

     Map("one" -> 1, "two" -> 2, "three" -> 3)
      .foldLeft("") { 
        case("", (key,value)) => key + "->" + value
        case(s, (key,value)) => s + ", " + key + "->" + value
      }
    
于 2016-05-06T11:01:58.117 に答える