2016-05-06 4 views
1

foldLeftがマップでどのように機能するかを理解したいと思います。私は、ゼロ要素と機能をfoldLeft私がリストを持っている場合、それがどのように動作するかを理解し、それを呼ぶのです:リストの代わりに地図でfoldLeftを理解する

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

私はlist1の最初の要素をゼロ要素0を追加し、追加する場所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. だからここに私の最初の要素はTuple2ありましたが、map2MapないTuple2であるため、ゼロ要素は何ですか?
  2. List、つまりlist1があったとき、私たちはいつも「list1の次の要素を取った」と答えました。 ??それはこの文脈でmap1

答えて

5

の別のペアです、あなたはタプルのリストとしてMapと考えることができmap1で「次の要素は何であるあなたは、このようなリストを作成することができます。List(1 -> 2.0, 3 -> 4.0, 5 -> 6.2)、およびコールをその上foldLeftあなたがリストとどのようにfoldLeft作品を理解していれば、その後、(それが多かれ少なかれありませんまさにMap.foldLeftです)今、あなたはそれがあまりにも:) があなたの特定の質問に答えるために地図をどのように動作するかを知っている:。

  1. を最初のパラメータはfoldLeftです。任意のタイプのものでよい。最初の例でも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つの要素を結合し、最初のパラメーターと同じ型の新しい値を生成します。この値は、第二の要素で再び、再び渡された...など おそらく、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 
    } 
  • Iは最初に説明したように、この文脈におけるマップ一種でありますリスト(むしろシーケンス)の。リストを扱うとき、「このリストの次の要素を取った」のように、この場合は「マップの次の要素」を取ります。それは、次の要素のタイプがどうなるかですので、あなたはそれを自分で言った、マップの要素はタプルは、以下のとおりです。本当に素晴らしいポストのため

    Map("one" -> 1, "two" -> 2, "three" -> 3) 
    .foldLeft("") { 
        case("", (key,value)) => key + "->" + value 
        case(s, (key,value)) => s + ", " + key + "->" + value 
    } 
    
  • +0

    1)ありがとう! 2)「あなたが最後の例でそれを持っているように」私には間違っているようです:ここで 'A'は' Tuple2'です。そうでない 'Map'です。訂正やコメントをお願いします。 3)最初の例で 'case(map、elem)'というだけでなく '(map、elem)'というだけではないのですか? 4) 'scala.collection.immutable.Map'も' scala.collection.immutable.Iterable'も 'foldLeft'を実装していないようです。どのようにこれらのコレクションには 'foldLeft'がありますか? – Make42

    +0

    私は4)が間違っていると思うが、私はそれらの異なる実装のためにまだ少し混乱している。 – Make42

    +0

    http://docs.scala-lang.org/tutorials/FAQ/collectionsから私はそうだ。リスト。それらは内部的にタプルのリストとして実装されていますか?それはあなたの投稿が示唆していることですが、それは本当ですか? (私は 'Map'のソースコードを調べる方法はわかりません。) – Make42

    関連する問題