1

使用此处的解决方案,我将两个地图添加在一起,并将它们视为稀疏向量。所以

def addTwoVectors(map1: Map[Int, Double], map2: Map[Int, Double]) = {
  map1 ++ map2.map{ case (k,v) => k -> (v + map1.getOrElse(k,0)) }
}

现在我想让这个通用的

def addTwoMaps[I, D <% Numeric[D]](m1: Map[I, D], m2: Map[I, D]) = {
  m1 ++ m2.map{ case (k,v) => k -> (v + m1.getOrElse(k, 0.asInstanceOf[D])) }
}

不幸的是,它似乎不起作用:

error: type mismatch;
found   : D
required: String

那么如何使这个函数通用呢?

4

1 回答 1

3

这个怎么样?

import scala.math.Numeric.Implicits._
def addTwoMaps[I, D](m1: Map[I, D], m2: Map[I, D])(implicit numeric: scala.math.Numeric[D]) = {
  m1 ++ m2.map{ case (k: I,v: D) => k -> (v + m1.getOrElse(k, numeric.zero)) }
}

因为我不知道我有哪一个 Numeric,我隐式地获取此信息,然后导入零方法,该方法特定于每种 Numeric 类型。

实际上,我确实相信,scalaz 解决方案会更干净,并希望有人会发布它。

于 2012-05-20T07:07:28.587 回答