【问题标题】:Is it possible to implement F#'s infrastructure for Units of Measurement in Scala?是否可以在 Scala 中实现 F# 的测量单位基础设施?
【发布时间】:2011-11-21 04:32:29
【问题描述】:

F# 附带对度量单位系统的特殊支持,该系统提供静态类型安全性,同时编译为数字类型,而不是通过包装/解包操作给运行时带来负担。

是否可以使用 Scala 的一些类型系统魔法来实现类似的东西?

【问题讨论】:

  • 恕我直言,这不是基于类型系统,而是基于对这些注释的某种(预)编译器支持(它们无法进入已编译的程序集,只会产生编译器错误) - 所以如果不更改 scala 编译器,我认为你不能在这里做同样的事情。
  • 也许是一个提示:ScalaU
  • this answer states 已经有一个 Java 实现,所以是的。我也看过一些概念验证,但没有研究过。

标签: scala types f# language-design units-of-measurement


【解决方案1】:

答案是

现在,肯定会有人将我指向Scalar,但这会让 runtime 检查。那么,或许可以指出 Jesper Nordenberg 的 type-safe units 或 Jim McBeath 的 take on it 的努力,但这些都比较麻烦和尴尬。

我会指出,而不是Units compiler plugin。早在 2008/2009 年,它就为 Scala 提供了一个非常好的单元系统,如 this post 所示。然而,它是通过扩展编译器来实现的,如果类型系统足够的话,这不是必需的。唉,它没有被维护,它不再工作了。

【讨论】:

  • 酷,不知道编译器插件!它有什么特点?你知道用 Scala 2.10 再次编译插件需要多长时间吗?
  • @soc 查看我链接的文章。它可从sbaz 获得,但即使在 2.7.x 的后续版本中也无法使用。我不知道要让它工作需要做些什么,但如果你愿意试一试,我当然会很感激。我想念它,只是不足以自己完成这项工作。
【解决方案2】:

【讨论】:

【解决方案3】:

有点。您可以使用指数元组中的整数类型表示非常轻松地对 SI 单位进行编码。有关示例实现,请参阅 http://svn.assembla.com/svn/metascala/src/metascala/Units.scala

如果单位被编码为单位类型和整数对的TList(例如,((M, _1), (S, _2)),其中M <: UnitS <: Unit),那么它也应该可以支持可扩展单位系统。在这种编码中,计算数量运算的类型变得有点复杂。

就性能而言,将值包装在包含单位信息的类型中总会产生内存开销。然而,在实际操作中可能没有性能开销,因为所有单元检查都是在编译时完成的。

【讨论】:

  • 我目前正在与您的图书馆合作,并试图使其在数字类型中也完全通用。到目前为止,这很难,但我很喜欢它。谢谢!
  • 使用 Scala 2.10 中引入的值类 (docs.scala-lang.org/sips/pending/value-classes.html),可以完全消除以这种方式进行测量单位的运行时开销。
【解决方案4】:

看看Units of Measure - A Scala Macro System。它似乎满足您的要求。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-02-27
    • 2021-04-27
    • 2020-08-23
    • 2015-10-07
    • 1970-01-01
    • 1970-01-01
    • 2013-11-11
    • 2014-09-13
    相关资源
    最近更新 更多