Мне нужна поддержка количеств с единицами измерения. Я бы хотел, чтобы система типов максимально эффективно применяла правильность блока. Например, нельзя сочетать граммы с долларами. Я иду по пути параметризованных типов, но этот код кажется гораздо более повторяющимся, чем код 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))
}
Есть ли более чистый способ сделать это? Барабанный бой «T <: UnitOfMeasure» - это главное, что меня беспокоит.
Напоминаю, что я видел пример в книге «Программирование в Скале» о том, что бодрость с базовым типом животных, которые имели совместимую пищу, и подтипы, которые могли есть только совместимый подтип, а не пищу для других. Я чувствую, что это связано, но я не уверен. Может быть, кто-то с удобной книгой может дразнить хорошие самородки. Суть решения состоит в том, чтобы использовать члены типа базового класса вместо этих аннотаций вариации повсюду. – rndmcnlly
mdmnclly, это был именно правильный указатель. Спасибо! Пожалуйста, напишите свой комментарий в качестве ответа, чтобы я мог его продвинуть. – mtnygard
+1. Мой долг погашается. – akarnokd