Выражать количество в единицах красиво в Scala - PullRequest
4 голосов
/ 05 мая 2009

Мне нужна поддержка для количества единиц. Я бы хотел, чтобы система типов максимально обеспечивала корректность единиц. Например, нельзя сочетать граммы с долларами. Я иду по пути параметризованных типов, но этот код кажется гораздо более повторяющимся, чем код 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))
}

Есть ли более чистый способ сделать это? Ударная битва "T <: UnitOfMeasure" - это главное, что меня беспокоит. </p>

Ответы [ 3 ]

4 голосов
/ 09 мая 2009

Я только что нашел эту статью

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

Надеюсь, это поможет.

1 голос
/ 01 октября 2009

От mdmcnlly:

Я помню, как видел пример в Программирование в книге Scala, что Dealth с базовым типом животных, которые имели совместимая еда и подтипы, которые мог только съесть их совместимые подтип а не еда для других. я чувствую, что это связано, но я не конечно. Может быть, кто-то с книгой удобный может дразнить хорошие самородки. Суть решения заключается в использовании вместо этого введите членов базового класса из этих аннотаций дисперсии во всем место.

1 голос
/ 07 мая 2009

У меня нет книги, но, возможно, вам нужен тип . Вы можете заключить свои классы в другой класс и добавить определение своего типа для использования в области видимости класса.

...