сохранение единиц измерения для вычислений в программировании

Мне было интересно, есть ли какие-нибудь сладкие языки, которые предлагают какую-то абстракцию для «футов» и «дюймов». или «см» и т. д. Я думал о том, чтобы сделать что-то вроде следующего на Java:

u(56).feet() + u(26).inches()

и в результате получить что-то вроде

17,7292 метра.

Один из возможных подходов - при создании нового значения немедленно преобразовать его в «базовые» единицы, такие как метры или что-то в этом роде, чтобы их можно было легко добавить.

Однако я бы предпочел иметь возможность сохранять единицы измерения, чтобы что-то вроде

u(799.95555).feet() - u(76).feet() 

возвращало

723.95555 feet

, а не

243.826452 meters - 23.1648 meters = 220.661652 meters

//220.661652 meters to feet returns 723.955551 feet 

. Поскольку эта проблема кажется действительно распространенной, существует ли какая-либо структура или даже существующий язык программирования, который элегантно справляется с этим?

Я полагаю, я могу просто добавить единицы измерения, как они есть в моих методах, добавляя соответствующие единицы вместе и преобразовывая только в + - * / [add / вычитать / умножать / делить], когда они запрашиваются, что отлично подходит для сложения и вычитания:

//A
{
    this.inches = 36.2;
    this.meters = 1;
}

//total length is 1.91948 m

если я добавлю это к объекту B со значениями

//B
{
    this.inches = 0.8;
    this.meters = 2;
}

//total length is 2.02032 m

, и я получу новый объект, который равен

{
    this.inches = 37;
    this.meters = 3;
}

//total length is 3.9398 meters

, что совершенно потрясающе , Я могу преобразовать его, когда захочу, без проблем. Но такие операции, как умножение, потерпят неудачу ...

//A * B = 3.87796383 m^2
{
    this.inches = 28.96;
    this.meters = 2;
}

// ...but multiplying piece-wise and then adding
// gives you 2.01868383 m^2, assuming you make 2m*1m give you 2 m^2.

Итак, все, что я действительно хотел показать с помощью этого примера, было то, что

( A1 + A2 ) * ( Z1 + Z2 ) is not ( A1 * Z1 ) + ( A2 * Z2 )

И я почти уверен, что это означает, что нужно преобразовать в обычную единицу, если они хотят умножить или делить.

Пример был в основном для того, чтобы препятствовать рефлексивному ответу, что вы добавляете или вычитаете их по частям перед преобразованием в последний момент, поскольку * и / не сработают.

tl; dr: Есть ли какие-нибудь хитрые способы сохранить единицы при программировании? Есть ли такие умные способы назвать методы / процедуры, чтобы мне было легко понять, что я добавляю, вычитаю и т. Д.?

6
задан sova 30 November 2010 в 22:53
поделиться