Expresar cantidades con unidades de forma bonita en Scala
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.
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.