在Scala中实现Measured值

Mal*_*lio 7 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
Run Code Online (Sandbox Code Playgroud)

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

我的问题:

  1. 这个问题是否有现存的术语?
  2. 这已经在Scala中完成了吗?
  3. 如果没有,我将如何表示"长度"和"以米为单位测量的长度"等概念?
  4. 这是用其他语言完成的吗?

由于承包商正在使用码数和磅数而美国宇航局正在使用米和牛顿,因此损失了价值3.3亿美元的火星探测器.测量库可以防止崩溃.

Arj*_*ijl 11

F#支持它,例如请参阅此链接以获取介绍.Scala on Units已经完成了一些工作,例如这里这里.还有一个Scala编译器插件,如本博文中所述.我简单地尝试安装它,但是使用Scala 2.8.1时,我在启动REPL时遇到异常,所以我不确定此插件是否在此时被主动维护.


psp*_*psp 5

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

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


I82*_*uch 5

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

jsr-275,已转移到谷歌代码. jscience实现了规范.这是一个很好的介绍.如果你想要一个更好的界面,我会用它作为基础并围绕它构建一个包装器.