Реализация измеренного значения в Scala

Измеренное значение состоит из (обычно неотрицательного) числа с плавающей запятой и единицы измерения. Дело в том, чтобы представить реальные величины и правила, которые ими управляют. Вот пример:

scala> val oneinch = Measure(1.0, INCH)
oneinch : Measure[INCH] = Measure(1.0)
scala> val twoinch = Measure(2.0, INCH)
twoinch : Measure[INCH] = Measure(2.0)
scala> val onecm = Measure(1.0, CM)
onecm : Measure[CM] = Measure(1.0)
scala> oneinch + twoinch
res1: Measure[INCH] = Measure(3.0)
scala> oneinch + onecm
res2: Measure[INCH] = Measure(1.787401575)
scala> onecm * onecm
res3: Measure[CMSQ] = Measure(1.0)
scala> onecm * oneinch
res4: Measure[CMSQ] = Measure(2.54)
scala> oncem * Measure(1.0, LITER)
console>:7: error: conformance mismatch
scala> oneinch * 2 == twoinch
res5: Boolean = true

Пока вы не слишком взволнованы, я не реализовал это, я просто придумал сеанс REPL. Я даже не уверен в синтаксисе, я просто хочу иметь возможность обрабатывать такие вещи, как добавление измеряемых величин (даже со смешанными единицами), умножение измеренных величин и т. Д., И в идеале мне нравится хваленая система типов Scala, чтобы гарантировать во время компиляции эти выражения имеют смысл.

Мои вопросы:

  1. Есть ли существующая терминология для этой проблемы?
  2. Было ли это уже сделано в Scala?
  3. Если нет, то как бы я представлял такие понятия, как " длина "и" поскольку я обычно редактирую файлы в разных каталогах с одинаковыми именами, я часто получаю много файлов, которые иначе невозможно отличить, и у Vim иногда возникают проблемы с восстановлением.

    В идеале, я хотел бы использовать схему именования, которую имеет постоянная отмена (% путь% к% file.undo ) для всех этих вспомогательных файлов; нет очевидного способа установить его, но можно ли это сделать с помощью макросов Buf {Read, Write} ?

53
задан gioele 25 October 2013 в 06:33
поделиться