【问题标题】:What are the strategies to support/integrate units of measurements in languages?支持/集成语言测量单位的策略是什么?
【发布时间】:2011-11-20 22:56:24
【问题描述】:

我想从纯语言设计的角度来看,SI 单位的“实现”需要哪些“特性”(语义和句法)。

如果有人声称一种语言对度量单位有很好的支持,那么通常期望哪种“功能”?

  • 只是像特殊文字或语法糖之类的东西?
  • 使单元类型安全(但没有代价高昂的运行时包装)的特殊约定?
  • 用于分数计算的特殊数学模式?
  • 单位之间的自动转换和强制转换?

例如,F# 集成了对语言中测量单位的支持。它如何改进e。 G。 a library 用于 Java?

应在语言中内置哪些功能以提高单位的可用性?哪些功能不一定与度量单位相关,但会使实现更好?

【问题讨论】:

    标签: java f# language-design units-of-measurement


    【解决方案1】:

    F# 相对于 Java UOM 库的优势在于简单——类型安全。如果您尝试添加3.<s>4.<m / s>,您将收到编译时错误。

    在 F# 中,UOM 在类型检查后被删除,因为它是唯一具有此功能的 .NET 语言。

    在回复评论时,这里是一个简单的分数类型及其用法:

    type Fraction<[<Measure>] 'a>(a : int, b : int) =
        member __.Divisor = a
        member __.Dividend = b
        member __.AsFloat = float a / float b
        static member (*) (a : Fraction<'a>, b : Fraction<'b>) : Fraction<'a * 'b> =
            Fraction(a.Divisor * b.Divisor, a.Dividend * b.Dividend)
    
    type [<Measure>] m
    type [<Measure>] kg
    type [<Measure>] s
    
    let a = Fraction<m / s>(4, 3)
    let b = Fraction<kg>(2, 5)
    let ``a times b`` = a * b
    

    返回的值为Fraction&lt;kg m/s&gt;类型,其AsFloat值为0.5333333333

    【讨论】:

    • 所以在 F# 中它基本上是一些通用的包装器,在编译时会被删除到包含的元素中?例如。速度?
    • Int32&lt;m / s&gt;,其中m / s是一种特殊类型,无法实际编译。
    • 是否支持任意类型?例如。如果我编写自己的 Fraction 类,它会起作用吗?
    【解决方案2】:

    从语言设计的角度来看,能够:

    1. 使用任意标签(不仅仅是字符串或其他原始标签,而是任意结构化标签)标记数据类型
    2. 对标签执行任意编译时计算
    3. 给定操作数标签和运算符(函数),计算应用于标记操作数的函数结果的标签

    这一切都可以通过 C++ 模板元编程and was done more than 10 years ago 完成。

    还有一个 Haskell 实现,它使用 Haskell 的(有限的)能力对类型类实例执行编译时计算。虽然它并不完整(AFAIK 没有分数幂,也没有非 SI 单位)。

    【讨论】:

    【解决方案3】:

    令人着迷。我在 Google 上搜索了这个提示,“我确信我可以在 Smalltalk 中轻松做到这一点”,并偶然发现了针对 JVM 和 Android 的 Frink http://futureboy.us/frinkdocs/

    跟踪测量单位(英尺、米、吨、美元、瓦特等) 通过所有计算,并允许您加、减、乘、 并毫不费力地将它们分开,并确保答案出来 正确,即使您混合使用加仑和升等单位。

    当然,关键是转化

    具有庞大的内置数据文件的数千种单位类型之间的单位转换。

    不确定性

    支持区间算术(也称为区间计算) 计算,允许您自动计算误差范围和 您所有计算中的不确定性。

    我相信您可以使用 Java 中的类,当然也可以使用 Ada 来做到这一点,但那会是很多(对不起)输入。

    【讨论】:

      【解决方案4】:

      在 1980 年代的 ACM SIGPLAN Notices 中有一篇关于此的好论文。这个想法是类型安全加上你在高中物理中学到的那种单位分析:例如,速度是英里/小时,时间是小时,所以将它们相乘得到以英里为单位的距离,类型系统强制执行你这样你就不会犯类别错误。语言或元语言将有办法指定所有这些。另一个例子,我最近在 Java 中做了一些货币工作,其中 CurrencyValue 除以 CurrencyValue 得到 BigDecimal,即汇率;一个 CurrencyValue 乘以或除以 BigDecimal 得到另一个 CurrencyValue,等等。

      这基本上是你过去做 PSSC 物理选择题的方式:忘记物理,只记住一些宇宙常数,然后根据指定数量的单位和单位来推理问题所需的答案,然后您可以自己构造所需的公式。

      【讨论】:

        【解决方案5】:

        现在可以在unitsofmeasurement.github.io 下找到 Java 库 (unitsofmeasurement.org) 的继任者。它是度量单位的 Java 标准JSR 363 的所在地。看看吧。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-07-03
          • 2016-12-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多