假设已定义此类措施:
[<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#不简化它?我在做错什么吗?
答案 0 :(得分:2)
据我基于几个实验所看到的,在简化过程中,编译器唯一使用kg = kilogram
的事实是最终类型是无单位的,即{{1} }类型。在我尝试过的所有其他情况下,它都将float<1>
和kg
保留为单位类型。
我怀疑编译器仍然知道kilogram
的类型为1.<kg/kilogram>
,但是因为它等效于kg/kilogram
,所以它不会显示-它显示了1
而不是float
或float<1>
。
值得注意的是,简化实际上是在实际需要的时候发生的-如果您尝试将值float<kg/kilogram>
与值1.<kg s / kilogram>
进行比较,则类型很明确:
1.<s / 1>
我没有确凿的证据(如指向规范的链接),但我认为编译器仅在实际需要时才进行简化,否则在编写时会保留单元注释。