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.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top