【问题标题】:F# Units of Measure doesn't simplifyF# 度量单位不会简化
【发布时间】:2019-11-12 13:12:56
【问题描述】:

假设已定义此类度量:

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

[<Measure>] type s

当我定义这样的绑定时:

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

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

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

不是将 y 的类型简化为float&lt;s&gt;,而是显示float&lt;kg s / kilogram&gt;

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

【问题讨论】:

    标签: f# units-of-measurement simplification


    【解决方案1】:

    据我所见,基于几个实验,编译器在简化过程中使用kg = kilogram这一事实的唯一地方是最终类型是无单位的,即float&lt;1&gt;类型。在我尝试过的所有其他情况下,它将kgkilogram 保留在单元类型中。

    我怀疑编译器仍然知道1.&lt;kg/kilogram&gt; 的类型是kg/kilogram,但是因为这相当于1,所以它不显示它——它显示float 而不是float&lt;1&gt; 或@987654330 @。

    值得注意的是,简化是在实际需要时发生的 - 如果您尝试将值 1.&lt;kg s / kilogram&gt; 与值 1.&lt;s / 1&gt; 进行比较,这是正确的类型:

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

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

    【讨论】:

    • 这与允许您创建等效类型的其他机制一致,例如类型缩写。如果您定义type MyType = string,然后编写let x : MyType = "hello",它将(直观地)将该类型注释为MyType,这很可能是因为这就是您告诉它要做的事情。这当然更进一步
    猜你喜欢
    • 2010-10-02
    • 2012-07-05
    • 2016-06-03
    • 2011-02-09
    • 2010-10-04
    • 2010-11-23
    • 2011-04-17
    • 2010-09-29
    • 1970-01-01
    相关资源
    最近更新 更多