Единицы измерения - метод повторного использования с различными единицами измерения, переданными в - PullRequest
2 голосов
/ 20 ноября 2010

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

Для двух позиций он возвращает скорость, для двух скоростей - ускорение, для двух значений энергии - Джоулей / секунду и т. Д.

Это физически возможно, но единицы измерения не позволяют мне этого делать - при первом использовании метод противопоставляется указанному типу:

let RateOfChangeWithTime (value1, value2) = (value2 - value1) / 1.0<SI.s>

let velocity = RateOfChangeWithTime(2.0<SI.m>, 1.0<SI.m>)
let acceleration = RateOfChangeWithTime(3.0<SI.m/SI.s>, 2.0<SI.m/SI.s>)

Строка velocity = вызывает ограничение метода на float<SI.m> -> float<SI.m>/float<SI.s>, что, конечно, правильно для скорости, но тогда строка acceleration = ... не компилируется, поскольку она передается в float<SI.m/SI.s>, что метод не ожидает.

Я бы хотел, чтобы RateOfChangeWithTime был инвариантом переданного типа, но просто возвращал единицу измерения, которая была разделена на секунды.

Казалось бы, это больше соответствует реальным живым ситуациям, это возможно сделать? (Я пытаюсь сделать это для более сложного сценария - см. Здесь (http://taumuon -jabuka.blogspot.com / 2010/11 / f-единиц измерения-с-реактивным.html ) * * тысяча двадцать-один

1 Ответ

6 голосов
/ 20 ноября 2010
let RateOfChangeWithTime (value1: float<_>, value2: float<_>) = (value2 - value1) / 1.0<SI.s>

let velocity = RateOfChangeWithTime(2.0<SI.m>, 1.0<SI.m>)
let acceleration = RateOfChangeWithTime(3.0<SI.m/SI.s>, 2.0<SI.m/SI.s>)
...