0

foldlを使用してリストからマップにペアを追加しようとしています。次のエラーが発生します。

"missing arguments for method /: in trait TraversableOnce; follow this method with `_' if you want to treat it as a partially applied function"

コード:

      val pairs = List(("a", 1), ("a", 2), ("c", 3), ("d", 4))

  def lstToMap(lst:List[(String,Int)], map: Map[String, Int] ) = {
    (map /: lst) addToMap ( _, _)
  }

  def addToMap(pair: (String, Int), map: Map[String, Int]): Map[String, Int] = {
      map + (pair._1 -> pair._2)
  }

なにが問題ですか?

4

4 に答える 4

10
scala> val pairs = List(("a", 1), ("a", 2), ("c", 3), ("d", 4))
pairs: List[(String, Int)] = List((a,1), (a,2), (c,3), (d,4))

scala> (Map.empty[String, Int] /: pairs)(_ + _)
res9: scala.collection.immutable.Map[String,Int] = Map(a -> 2, c -> 3, d -> 4)

しかし、あなたが知っている、あなたはただすることができます:

scala> pairs.toMap
res10: scala.collection.immutable.Map[String,Int] = Map(a -> 2, c -> 3, d -> 4)
于 2013-03-24T18:15:49.197 に答える
1

これを機能させるには、addToMapの入力値を交換し、括弧で囲む必要があります。

  def addToMap( map: Map[String, Int], pair: (String, Int)): Map[String, Int] = {
    map + (pair._1 -> pair._2)
  }

  def lstToMap(lst:List[(String,Int)], map: Map[String, Int] ) = {
    (map /: lst)(addToMap)
  }

missingfaktorの答えは、はるかに簡潔で、再利用可能で、scalaのようなものです。

于 2013-03-24T18:20:57.833 に答える
1

すでにTuple2のコレクションがある場合は、これを自分で実装する必要はありません。要素がタプルである場合にのみ機能するtoMapメソッドがすでにあります。

完全な署名は次のとおりです。

def toMap[T, U](implicit ev: <:<[A, (T, U)]): Map[T, U]

A <:< (T, U)これは、本質的に要素タイプAを取得し、それをタイプのタプルにキャスト/変換できる関数である暗黙を要求することによって機能します(T, U)。別の言い方をすれば、暗黙の証人が必要であるということAです-a (T, U)。したがって、これは完全にタイプセーフです。

更新:@missingfaktorが言ったことです

于 2013-03-25T05:30:23.823 に答える
1

これは、地図上で正しく折りたたむことに関する質問に対する直接の答えではありませんが、それを強調することが重要だと思います。

  • aはペアMapのジェネリックとして扱うことができますTraversable

そして、あなたは簡単に2つを組み合わせることができます!

scala> val pairs = List(("a", 1), ("a", 2), ("c", 3), ("d", 4))
pairs: List[(String, Int)] = List((a,1), (a,2), (c,3), (d,4))

scala> Map.empty[String, Int] ++ pairs
res1: scala.collection.immutable.Map[String,Int] = Map(a -> 2, c -> 3, d -> 4)

scala> pairs.toMap
res2: scala.collection.immutable.Map[String,Int] = Map(a -> 2, c -> 3, d -> 4)
于 2013-03-25T09:05:24.050 に答える