Exprimer des quantités avec de jolies unités en Scala
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.
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.