在语言中支持/整合测量单位的策略是什么?

soc*_*soc 8 java f# language-design units-of-measurement

我想从纯语言设计的角度来看,哪些"特征"(语义和句法)是SI单位的"实现"需要.

如果有人声称某种语言对测量单位有很大的支持,那么通常会预期哪些"功能"?

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

例如,F#集成了对语言中测量单位的支持.它如何改进例如Java

应该在语言中加入哪些功能以提高单元的可用性?哪些功能不一定与测量单位有关,但实现更好?

Ram*_*nir 3

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
Run Code Online (Sandbox Code Playgroud)

返回的值是类型Fraction<kg m/s>,其AsFloat值为0.5333333333