在类中参数化Double和BigDecimal的惯用法

时间:2018-02-20 20:42:00

标签: scala object type-parameter

是否有一种很好的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)。

0 个答案:

没有答案