F#度量单位无法简化

时间:2019-07-01 22:18:36

标签: f# units-of-measurement simplification

假设已定义此类措施:

[<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#不简化它?我在做错什么吗?

1 个答案:

答案 0 :(得分:2)

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

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

值得注意的是,简化实际上是在实际需要的时候发生的-如果您尝试将值float<kg/kilogram>与值1.<kg s / kilogram>进行比较,则类型很明确:

1.<s / 1>

我没有确凿的证据(如指向规范的链接),但我认为编译器仅在实际需要时才进行简化,否则在编写时会保留单元注释。