如何使用 Numeric[T] 表示任何数字类型的零
How to use Numeric[T] to represent zero of any numeric type
我有一段 Scala 代码,我想使其更通用。我知道 Numeric[T]
存在,但我不确定如何使用它。
def sumMaps[A](m1: Map[A, Long], m2: Map[A, Long]): Map[A, Long] = {
m1 ++ m2.map { case (k, v) => k -> (v + m1.getOrElse(k, 0L)) }
}
def sumMaps[A](m1: Map[A, Int], m2: Map[A, Int]): Map[A, Int] = {
m1 ++ m2.map { case (k, v) => k -> (v + m1.getOrElse(k, 0)) }
}
def sumMaps[A](m1: Map[A, Double], m2: Map[A, Double]): Map[A, Double] = {
m1 ++ m2.map { case (k, v) => k -> (v + m1.getOrElse(k, 0)) }
}
我想写这样的东西(只写一次),其中零值会自动转换为 B
类型。
def sumMaps[A, B: Numeric[?]](m1: Map[A, B], m2: Map[A, B]): Map[A, B] = {
m1 ++ m2.map { case (k, v) => k -> (v + m1.getOrElse(k, 0)) }
}
尝试
def sumMaps[A, B](m1: Map[A, B], m2: Map[A, B])(implicit num: Numeric[B]): Map[A, B] = {
m1 ++ m2.map { case (k, v) => k -> num.plus(v, m1.getOrElse(k, num.zero)) }
}
或
import Numeric.Implicits._
def sumMaps[A, B](m1: Map[A, B], m2: Map[A, B])(implicit num: Numeric[B]): Map[A, B] = {
m1 ++ m2.map { case (k, v) => k -> (v + m1.getOrElse(k, num.zero)) }
}
或
def sumMaps[A, B: Numeric](m1: Map[A, B], m2: Map[A, B]): Map[A, B] = {
val num = implicitly[Numeric[B]]
import num._
m1 ++ m2.map { case (k, v) => k -> (v + m1.getOrElse(k, zero)) }
}
导入提供隐式转换infixNumericOps
m1 ++ m2.map { case (k, v) => k -> (infixNumericOps(v) + m1.getOrElse(k, num.zero)) }
所以我们不必像第一个示例那样显式使用 Numeric.plus
。
我有一段 Scala 代码,我想使其更通用。我知道 Numeric[T]
存在,但我不确定如何使用它。
def sumMaps[A](m1: Map[A, Long], m2: Map[A, Long]): Map[A, Long] = {
m1 ++ m2.map { case (k, v) => k -> (v + m1.getOrElse(k, 0L)) }
}
def sumMaps[A](m1: Map[A, Int], m2: Map[A, Int]): Map[A, Int] = {
m1 ++ m2.map { case (k, v) => k -> (v + m1.getOrElse(k, 0)) }
}
def sumMaps[A](m1: Map[A, Double], m2: Map[A, Double]): Map[A, Double] = {
m1 ++ m2.map { case (k, v) => k -> (v + m1.getOrElse(k, 0)) }
}
我想写这样的东西(只写一次),其中零值会自动转换为 B
类型。
def sumMaps[A, B: Numeric[?]](m1: Map[A, B], m2: Map[A, B]): Map[A, B] = {
m1 ++ m2.map { case (k, v) => k -> (v + m1.getOrElse(k, 0)) }
}
尝试
def sumMaps[A, B](m1: Map[A, B], m2: Map[A, B])(implicit num: Numeric[B]): Map[A, B] = {
m1 ++ m2.map { case (k, v) => k -> num.plus(v, m1.getOrElse(k, num.zero)) }
}
或
import Numeric.Implicits._
def sumMaps[A, B](m1: Map[A, B], m2: Map[A, B])(implicit num: Numeric[B]): Map[A, B] = {
m1 ++ m2.map { case (k, v) => k -> (v + m1.getOrElse(k, num.zero)) }
}
或
def sumMaps[A, B: Numeric](m1: Map[A, B], m2: Map[A, B]): Map[A, B] = {
val num = implicitly[Numeric[B]]
import num._
m1 ++ m2.map { case (k, v) => k -> (v + m1.getOrElse(k, zero)) }
}
导入提供隐式转换infixNumericOps
m1 ++ m2.map { case (k, v) => k -> (infixNumericOps(v) + m1.getOrElse(k, num.zero)) }
所以我们不必像第一个示例那样显式使用 Numeric.plus
。