, Die Mengen mit Einheiten artig in Scala
Frage
Ich brauche für Mengen mit Einheiten zu unterstützen. Ich mag die Art Systemeinheit Korrektheit so viel wie möglich zu erzwingen. Zum Beispiel sollte es nicht möglich sein Gramm mit Dollar zu kombinieren. Ich werde den Weg der parametrisierte Typen nach unten, aber dieser Code scheint weit mehr als repetitious Scala Code, den ich von anderen gesehen habe.
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))
}
Gibt es einen sauberen Weg, dies zu tun? Der Paukenschlag von. „T <: UnitOfMeasure“ ist die Hauptsache, die mich stört
Lösung
Ich habe gerade dieser Artikel
http://www.michaelnygard.com/blog/2009/05 /units_of_measure_in_scala.html
Hoffe, es hilft.
Andere Tipps
Ich habe das Buch nicht, aber vielleicht ein selbst Typ ist, was du brauchst. Sie können Ihre Klassen in einer anderen Klasse umschließen und Ihre Typdefinition hinzufügen, in dem Klassenbereich verwendet werden.
Von mdmcnlly:
Ich erinnere sehen ein Beispiel in der Programmierung in Scala Buch, das dealth mit einem Basistyp von Tieren, die eine hatten kompatibel Lebensmittel und Subtypen, essen kann nur ihre kompatibel Subtyp und nicht Nahrung für andere. ich fühle mich wie es verwandt ist, aber ich bin nicht sicher. Vielleicht hat jemand mit dem Buch praktisch die guten Nuggets herauszukitzeln kann. Der Kern der Lösung ist die Verwendung Typ Mitglieder einer Basisklasse statt dieser Varianz Annotationen in aller der richtige Ort.