Выражать количество в единицах красиво в Scala
Вопрос
Мне нужна поддержка для количеств в единицах. Я бы хотел, чтобы система типов максимально обеспечивала корректность единиц. Например, нельзя сочетать граммы с долларами. Я иду по пути параметризованных типов, но этот код кажется гораздо более повторяющимся, чем код Scala, который я видел от других.
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))
}
Есть ли более чистый способ сделать это? Удар барабана & Quot; T & Lt;: UnitOfMeasure & Quot; это главное, что меня беспокоит.
Решение
Я только что нашел эту статью
http://www.michaelnygard.com/blog/2009/05 /units_of_measure_in_scala.html р>
Надеюсь, это поможет.
Другие советы
У меня нет книги, но, возможно, собственный тип - вот что тебе нужно. Вы можете заключить свои классы в другой класс и добавить определение своего типа для использования в области видимости класса.
От mdmcnlly:
Я помню, как видел пример в Программирование в книге Scala, что Dealth с базовым типом животных, которые имели совместимая еда и подтипы, которые мог только съесть их совместимые подтип а не еда для других. я чувствую, что это связано, но я не конечно. Может быть, кто-то с книгой удобный может дразнить хорошие самородки. Суть решения заключается в использовании вместо этого введите членов базового класса из этих аннотаций дисперсии во всем место.