1

ここでのソリューションを使用して、2つのマップを一緒に追加し、それらをスパースベクトルであるかのように扱います。それで

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

原因私が持っている数値がわからないので、この情報を暗黙的に取得してから、すべての数値タイプに固有のゼロメソッドをインポートしています。

実際、私は、scalazソリューションがはるかにクリーンになると信じており、誰かがそれを投稿することを望んでいます。

于 2012-05-20T07:07:28.587 に答える