F# 度量单位不会简化

F# Units of Measure doesn't simplify

假设定义了这样的度量:

[<Measure>] type kilogram
[<Measure>] type kg = kilogram

[<Measure>] type s

当我这样定义绑定时:

let x = 1.<kg / kilogram> // Type of x: float

F# 正确地将 x 的类型从 float<kg/kilogram> 简化为 float。 但是当我像这样添加另一个单元时:

let y = 1.<kg s / kilogram> // Type of y: float<kg s / kilogram>

不是将 y 的类型简化为 float<s>,而是显示 float<kg s / kilogram>

在这种情况下,为什么 F# 不对其进行简化?我做错了什么吗?

据我所知,基于几个实验,编译器在简化过程中使用 kg = kilogram 这一事实的唯一地方是最终类型为 unit-less,即float<1> 类型。在我尝试过的所有其他情况下,它都将 kgkilogram 保留在单位类型中。

我怀疑编译器仍然知道 1.<kg/kilogram> 的类型是 kg/kilogram,但是因为这等同于 1,所以它不显示它 - 它显示 float 而不是 float<1>float<kg/kilogram>.

值得注意的是,简化是在实际需要时发生的 - 如果您尝试将值 1.<kg s / kilogram> 与值 1.<s / 1> 进行比较,则为 well-typed:

let y = 1.<kg s / kilogram>
y = 1.<s/1>

我没有确凿的证据(比如 link 规范),但我认为编译器只在实际需要时才进行简化,否则会在您编写单元注释时保留它们.