Pregunta

Necesito soporte para cantidades con unidades. Me gustaría que el sistema de tipos imponga la corrección de la unidad tanto como sea posible. Por ejemplo, no debería ser posible combinar gramos con dólares. Voy por el camino de los tipos parametrizados, pero este código parece mucho más repetitivo que el código Scala que he visto de otros.

abstract class UnitOfMeasure

abstract class Range[T] {
  type T <: UnitOfMeasure
}
class Quantity[T <: UnitOfMeasure](value: Double)
class DefiniteRange[T<:UnitOfMeasure](lowerBound: Quantity[T], upperBound: Quantity[T]) extends Range[T]
class Confidence(conf: Double) {
  require(0.0 <= conf && conf <= 1.0)
}
class ConfidenceInterval[T<:UnitOfMeasure](lowerBound: Quantity[T], upperBound: Quantity[T], confidence: Confidence) extends Range[T] {
    def this(lower: Quantity[T], upper: Quantity[T]) = this(lower, upper, new Confidence(.90))
}

¿Hay una forma más limpia de hacer esto? El tambor de & Quot; T & Lt;: UnitOfMeasure & Quot; es lo principal que me molesta.

¿Fue útil?

Solución

Acabo de encontrar este artículo

http://www.michaelnygard.com/blog/2009/05 /units_of_measure_in_scala.html

Espero que ayude.

Otros consejos

No tengo el libro, pero tal vez un self type es lo que necesitas. Puede incluir sus clases en otra clase y agregar su definición de tipo para usar en el alcance de la clase.

De mdmcnlly:

  

Recuerdo haber visto un ejemplo en el   Programación en libro Scala que dealth   con un tipo base de animales que tenían un   alimentos compatibles y subtipos que   solo podía comer su compatible   subtipo y no comida para otros. yo   siento que está relacionado pero no estoy   Por supuesto. Quizás alguien con el libro   práctico puede sacar las buenas pepitas.   La esencia de la solución es usar   escriba miembros de una clase base en su lugar   de estas anotaciones de varianza en todo   el lugar.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top