2012-05-20 19 views
1

使用解决方案here,我将两个地图加在一起,并将它们视为稀疏矢量。所以使scala地图添加通用

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 

那么,如何使这个功能通用?

+0

注意'Numeric'是一个类型类型,所以你应该使用'D:Numeric',而不是'D <%Numeric [D]'。 –

回答

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)) } 
} 

因为我不知道是哪一个数字我有,我采取这一信息暗示,然后导入零的方法,这是具体的每一个数字类型。

实际上,我确实相信,斯卡拉斯解决方案将更加清洁,并希望有人发布它。

+0

谢谢!这工作完美。 – JasonMond