1

オーバーライドされた適用/適用解除のためのルールまたはむしろ「ベスト プラクティス」が Scala にあるかどうか疑問に思っています。私は、次のプロパティを保持することが良い考えであるかどうかに特に興味があります。

ケースクラス C(x: T) が与えられると、すべての x について、 Some(x) == C.unapply(C.apply(x)) になります。

私が尋ねる理由は、BigDecimal が 16 の精度に制限されるようにするために使用する予定の次のコードのためです。

class BoundedBigDecimal(private val bd: BigDecimal) extends Proxy {
  val self: BigDecimal = bd setScale (BoundedBigDecimal.PRECISION)
}

object BoundedBigDecimal {
  val PRECISION = 16
  def apply(bd: BigDecimal) = new BoundedBigDecimal(bd)
  def unapply(bbd: BoundedBigDecimal) = Some(bbd.self)
}

ご覧のとおり、プロパティは必ずしもここで保持されるわけではありません。

それは...ですか:

1) 一般的な場合に理想的に強制されるべきプロパティ?

2) 私がやろうとしていることを行う正しい方法は?

ありがとう!

4

2 に答える 2

2

そのために「タグ付きタイプ」を使用することを好みます。

type Tagged[U] = { type Tag = U }
type @@[T, U] = T with Tagged[U]

trait Bounded

object BoundedBigDecimal {
  val PRECISION = 16

  def apply(bd: BigDecimal) = 
    (bd setScale PRECISION).asInstanceOf[BigDecimal @@ Bounded]

  def unapply(bbd: BigDecimal @@ Bounded) = 
    Some(bbd)

  implicit def toBD(bd: BigDecimal): BigDecimal @@ Bounded = 
    BoundedBigDecimal(bd)
}

タグ付きタイプとそれを使用する利点の適切な説明は、ここここにあります。

于 2013-11-08T06:16:52.207 に答える
0

使用しない理由:

def testPrecision(bd:BigDecimal):Boolean = 
db.scale == 16

または私は何かを逃していますか?

編集: ReducePrecision に更新:

def boundedBD(bd:BigDecimal):BigDecimal =
{   
   val maxPrecision = 16
   bd.scale match {
   case x if x > maxPrecision  => bd setScale  maxPrecision 
   case _ => bd
}


}
于 2013-11-07T22:14:14.037 に答える