2012-05-20 22 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