是否有一种很好的Scala-idiomatic方法来参数化数学相关类(如向量或矩阵)以使用Doubles或BigDecimals?以下代码似乎有效,但它有点丑陋,只能实现添加,如果我添加对Floats,BigInts等的支持,复杂性和丑陋性将呈指数级增长。
abstract class Decimal[T] {
val contents:T
def +[S](other:Decimal[S]) = (this.contents, other.contents) match {
case (a:Double, b:Double) => BoxedDouble(a+b)
case (a:BigDecimal, b:Double) => BoxedBigDecimal(a+b)
case (a:Double, b:BigDecimal) => BoxedBigDecimal(a+b)
case (a:BigDecimal, b:BigDecimal) => BoxedBigDecimal(a+b)
}
}
case class BoxedDouble(contents:Double) extends Decimal[Double]
case class BoxedBigDecimal(contents:BigDecimal) extends Decimal[BigDecimal]
val x = BoxedDouble(3.3)
val y = BoxedBigDecimal(4.4)
println(x+y) //outputs BoxedBigDecimal(7.7)
这些课程不会共享一个界面,但似乎应该有一种方法来抽象你正在用你所做的精确度做的数学。我不想仅仅使用BigDecimal,因为大多数时候,我宁愿使用原始类型的速度和内存效率。但是,我希望能够有时提高精度,而不必拥有我的代码的两个副本(一个用于Double,一个用于BigDecimal)。