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>
类型。在我尝试过的所有其他情况下,它都将 kg
和 kilogram
保留在单位类型中。
我怀疑编译器仍然知道 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 规范),但我认为编译器只在实际需要时才进行简化,否则会在您编写单元注释时保留它们.
假设定义了这样的度量:
[<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>
类型。在我尝试过的所有其他情况下,它都将 kg
和 kilogram
保留在单位类型中。
我怀疑编译器仍然知道 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 规范),但我认为编译器只在实际需要时才进行简化,否则会在您编写单元注释时保留它们.