我想知道是否有任何甜美的语言为“英尺”,“英寸”或“cm”等提供某种抽象。我正在考虑在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/subtract/multiply/divide],这对于加减法非常有用:
//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 )

而且我很确定这意味着如果他们想乘或除,就必须转换成一个公共(public)单位。

该示例主要是阻止自反答案,因为您在最后一刻进行转换之前,请逐段添加或减去它们,因为*/将失败。

tl;博士:是否有任何聪明的方法可以在编程中保留单元?是否有巧妙的方法/例程命名方法,使我很容易理解要加减的内容,等等?

最佳答案

我知道事实上有一种语言,尽管我自己还没有使用过。
它称为Frink

它不仅允许您为相同的尺寸混合使用不同的单位,而且还可以对几种不同的物理测量进行操作。网站上的sample calculations很有趣。我特别喜欢Superman

关于naming-conventions - 保留用于编程中计算的单位,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4319555/

10-14 10:55