Question

J'ai besoin d'assistance pour les quantités avec des unités. J'aimerais que le système de typage impose le plus possible l'exactitude des unités. Par exemple, il ne devrait pas être possible de combiner des grammes avec des dollars. Je vais dans la voie des types paramétrés, mais ce code semble beaucoup plus répétitif que le code Scala que j'ai vu chez d'autres.

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

Existe-t-il une manière plus propre de procéder? Le battement de tambour de & Quot; T & Lt;: UnitOfMeasure & Quot; est la principale chose qui me dérange.

Était-ce utile?

La solution

Je viens de trouver cet article

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

J'espère que ça aide.

Autres conseils

Je n'ai pas le livre, mais peut-être un type auto est ce que vous avez besoin. Vous pouvez inclure vos classes dans une autre classe et ajouter votre définition de type à utiliser dans la portée de la classe.

De mdmcnlly:

  

Je me souviens avoir vu un exemple dans le   Programmation dans Scala book that dealth   avec un type de base d'animaux qui avaient un   aliments compatibles, et sous-types qui   ne pouvait que manger leur compatible   sous-type et pas de nourriture pour les autres. je   se sentir comme il est lié mais je ne suis pas   sûr. Peut-être que quelqu'un avec le livre   pratique peut démêler les bonnes pépites.   L'essentiel de la solution est d'utiliser   taper les membres d'une classe de base à la place   de ces annotations de variance partout   l'endroit.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top