2009-05-05 3 views
4

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

+5

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

+0

mdmnclly, это был именно правильный указатель. Спасибо! Пожалуйста, напишите свой комментарий в качестве ответа, чтобы я мог его продвинуть. – mtnygard

+0

+1. Мой долг погашается. – akarnokd

ответ

4

Я просто нашел эту статью

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

Надеется, что это помогает.

+2

Я тоже собирался опубликовать это, а потом понял, что автор этой статьи, скорее всего, является оригинальным плакатом этого вопроса :) Может быть, он должен ответить на свой вопрос сейчас ... –

+1

Да, это был я. Сначала я задал этот вопрос. Отдельно, ожидая ответов здесь, я получил твит со ссылками. Я исследовал библиотеку, а затем написал это сообщение в блоге на основе библиотеки. Я думал, что это будет странно (и может оторваться как самореклама), чтобы ответить на мой собственный вопрос ссылкой со своим собственным блогом! – mtnygard

1

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

1

От mdmcnlly:

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

Смежные вопросы