在Scala中实现Measured值

时间:2010-12-02 04:47:45

标签: scala

测量值由(通常为非负)浮点数和度量单位组成。重点是表示现实世界的数量,以及管理它们的规则。这是一个例子:

scala> val oneinch = Measure(1.0, INCH)
oneinch : Measure[INCH] = Measure(1.0)
scala> val twoinch = Measure(2.0, INCH)
twoinch : Measure[INCH] = Measure(2.0)
scala> val onecm = Measure(1.0, CM)
onecm : Measure[CM] = Measure(1.0)
scala> oneinch + twoinch
res1: Measure[INCH] = Measure(3.0)
scala> oneinch + onecm
res2: Measure[INCH] = Measure(1.787401575)
scala> onecm * onecm
res3: Measure[CMSQ] = Measure(1.0)
scala> onecm * oneinch
res4: Measure[CMSQ] = Measure(2.54)
scala> oncem * Measure(1.0, LITER)
console>:7: error: conformance mismatch
scala> oneinch * 2 == twoinch
res5: Boolean = true

在你太兴奋之前,我还没有实现这一点,我只是愚弄了一个REPL会话。我甚至不确定语法,我只是想能够处理诸如添加测量数量(即使是混合单位),乘以测量数量等等,理想情况下,我喜欢Scala自夸式类型系统来保证在编译时,表达式是有意义的。

我的问题:

  1. 这个问题是否有现存的术语?
  2. 这已经在Scala中完成了吗?
  3. 如果没有,我将如何表示“长度”和“以米为单位测量的长度”等概念?
  4. 这是用其他语言完成的吗?
  5. A $330-million Mars probe失败了,因为承包商使用了码和磅,NASA正在使用米和牛顿。测量库可以防止崩溃。

6 个答案:

答案 0 :(得分:11)

F#支持它,例如参见this link作为介绍。 Scala on Units已经完成了一些工作,例如herehere。还有一个Scala编译器插件,如this blog post中所述。我简单地尝试安装它,但是使用Scala 2.8.1时,我在启动REPL时遇到异常,所以我不确定此插件是否在此刻被主动维护。

答案 1 :(得分:5)

您的问题完全用一个词来回答。你以后可以感谢我。

弗林克。 http://futureboy.us/frinkdocs/

答案 2 :(得分:5)

嗯,这个功能存在于Java中,这意味着您可以直接在Scala中使用它。

jsr-275,已移至google codejscience实现了规范。这是一个很好的introduction。如果你想要一个更好的界面,我会用它作为基础并围绕它构建一个包装器。

答案 3 :(得分:1)

仅供参考,我在Scala中开发了一个Scalar类来表示物理单位。我目前正在将它用于我在空中交通管制方面的R& D工作,它对我来说效果很好。它不会在编译时检查单元一致性,但会在运行时检查。我有一个独特的方案,可以在测试应用程序后用基本数字类型轻松替换它以提高效率。您可以在

找到代码和用户指南

http://russp.us/scalar-scala.htm

以下是该网站的摘要:

摘要 - Scala类旨在表示物理标量并消除涉及隐式物理单位的错误(例如,混淆弧度和度数)。重载标准算术运算符以提供与基本数字类型相同的语法。标量类本身不定义任何单元,但是是包的一部分,包括单元的标准度量系统和许多常见的非公制单元的完整实现。标量包还允许用户为任何特定应用程序或域定义专用或减少的物理单元集。一旦开发并测试了应用程序,就可以在编译时关闭标量类,以实现对基本数字类型的操作的执行效率,这比基本数字类型快一个数量级。标量类也可用于离散单元,以强制执行整数计数的类型检查,从而通过附加的动态类型检查增强Scala的静态类型检查。

答案 4 :(得分:1)

让我澄清一下我以前的帖子。我应该说,“通过简单地使用我的Scalar类,这些错误[”米/码转换错误“]会自动避免(而非”处理“)。所有单位转换都是自动完成的。这是最简单的部分。

更难的部分是检查单位不一致性,例如为速度添加长度。这就是动态与静态类型检查问题出现的地方。我同意静态检查通常是可取的,但只有在不牺牲可用性和便利性的情况下才能完成。

我已经看过至少两个用于静态检查单元的“项目”,但我从来没有听说有人将它们用于实际工作。如果有人知道他们被使用的情况,请告诉我。在您将软件用于实际工作之前,您不知道会出现什么类型的问题。

正如我上面所写,我目前正在使用我的Scalar类(http://russp.us/scalar-scala.htm)进行ATC的R& D工作。为了实用性和便利性,我不得不做一些调整,但它对我来说效果很好。如果一个经过验证的单元出现,我愿意考虑静态单元实现,但是现在我觉得我有99%的价值。嘿,绝大多数的科学家和工程师只使用“双打”,所以让我有些松懈!

答案 5 :(得分:0)

“是的,带有运行时类型检查的ATC软件?我现在可以看到头条新闻:”34号航班因电表/场转换而下降。“

抱歉,但你不知道你在说什么。 ATC软件在部署之前已经过的测试。这是足够的时间来捕获单位不一致错误。

更重要的是,米/码转换在这里甚至不是问题。只需使用我的Scalar类即可自动处理这些类型的错误。对于那些类型的错误,您既不需要静态也不需要动态检查。静态与动态检查的问题仅出现在单元不一致中,如增加时间长度。这些类型的错误不太常见,通常会在第一次测试运行时进行动态检查。

顺便说一下,这里的界面很糟糕。