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