2013-11-07 3 views
1

Мне интересно, существует ли правило Scala для перераспределения, применяемое/не применяемое правило. Меня особенно интересует, имеет ли смысл иметь следующее свойство:Scala - примените правила неприменимости

Данный класс case C (x: T) для всех x, Some (x) == C.unapply (C.apply (Икс)).

Я спрашиваю потому, что в следующем коде я планирую использовать для обеспечения 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) Правильный способ делать то, что я пытаюсь сделать?

Спасибо!

ответ

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 
} 


} 
+2

Спасибо за ваш ответ! На самом деле, дело не в том, чтобы проверить, равна ли точность 16, а в том, чтобы заставить каждое значение BigDecimal иметь максимум точности 16. Вот почему я определяю этот BoundedBigDecimal, так что BoundedBigDecimal (1.1111111111111111111111111111111111) становится 1.111111111111111111. Извините, если мой вопрос был неясен ... – user510159

+0

см. Мой обновленный пост, если это работает для вас: D –

2

Я предпочитаю использовать "Tagged типа" для этого:

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

Хорошее описание меченых типов и преимущества его использования является here и here.

+0

Но в отличие от 'newtype's в Haskell, тегированные типы в Scala не помешают вам случайно добавить два разных тега' BigDecimal' , как первое сообщение отмечает. –

Смежные вопросы