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