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

这不是问题的直接答案,即在地图上正确折叠,但我认为强调这一点很重要

  • aMap可以被视为对的Traversable泛型

您可以轻松地将两者结合起来!

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 回答
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)。另一种说法是,它需要一个隐含的证人Ais-a (T, U)。因此,这是完全类型安全的。

更新:这是@missingfaktor 所说的

于 2013-03-25T05:30:23.823 回答