Esprimere quantità con unità graziosamente in Scala
Domanda
Ho bisogno di supporto per quantità con unità. Vorrei che il sistema dei tipi imponesse il più possibile la correttezza dell'unità. Ad esempio, non dovrebbe essere possibile combinare grammi con dollari. Sto percorrendo il percorso di tipi parametrici, ma questo codice sembra molto più ripetitivo del codice Scala che ho visto dagli altri.
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))
}
C'è un modo più pulito per farlo? Il tamburo di & Quot; T & Lt;: UnitOfMeasure & Quot; è la cosa principale che mi dà fastidio.
Soluzione
Ho appena trovato questo articolo
http://www.michaelnygard.com/blog/2009/05 /units_of_measure_in_scala.html
Spero che sia d'aiuto.
Altri suggerimenti
Non ho il libro, ma forse un self type è ciò che hai bisogno. È possibile racchiudere le classi in un'altra classe e aggiungere la definizione del tipo da utilizzare nell'ambito della classe.
Da mdmcnlly:
Ricordo di aver visto un esempio in Programmando nel libro della Scala quel benessere con un tipo base di animali che aveva un alimenti compatibili e sottotipi che poteva solo mangiare il loro compatibile sottotipo e non cibo per gli altri. io sento come se fosse correlato ma non lo sono sicuro. Forse qualcuno con il libro utile può stuzzicare le buone pepite. L'essenza della soluzione è usare digitare invece i membri di una classe base di queste annotazioni di varianza dappertutto il posto.