Выражать количество в единицах красиво в Scala

StackOverflow https://stackoverflow.com/questions/823848

  •  05-07-2019
  •  | 
  •  

Вопрос

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top