【问题标题】:F# units of measure conversion based on type基于类型的 F# 度量单位转换
【发布时间】:2011-04-17 01:23:19
【问题描述】:

我正在尝试在 F# 中编写一个“度量单位”转换器。

我已经定义了两个度量单位,KWhMWh,我正在尝试编写一个函数来在两者之间进行转换,以在数字类型上进行模式匹配。我可以将 KWh 的浮点数、十进制数和整数转换为 MWh。

[<Measure>]
type KWh

[<Measure>]
type MWh

// want to do this, but can't because x is not x:obj, 
// its something like x:float<KWh>
let toMWh x = 
    match x with
    | :? float<KWh>     -> x * (1.0<MWh>/1000.0<KWh>)
    | :? int<KWh>       -> // ...


// above code not valid f#

当我没有 obj 类型时,我无法弄清楚如何正确分支类型。

【问题讨论】:

    标签: f# units-of-measurement


    【解决方案1】:

    老实说,我只会做低预算的超载解决方案:

    [<Measure>] 
    type KWh 
    
    [<Measure>] 
    type MWh 
    
    type Convert = 
        static member toMWh (x:float<KWh>) =  x * 1.0<MWh> / 1000.0<KWh>
        static member toMWh (x:int<KWh>) =  x * 1<MWh> / 1000<KWh>
    
    printfn "%d" (int(Convert.toMWh(5000<KWh>)))
    printfn "%f" (float(Convert.toMWh(5500.0<KWh>)))
    

    也就是说,有人可能会想出一个聪明的、类型安全的方法来使用inline(我不确定是否可能)。我会避免你的运行时匹配,因为它牺牲了静态类型安全(这有点像单位)。 (此外,无论如何都不可能进行单元的运行时匹配,因为单元在编译期间会被删除。)

    【讨论】:

    • 这行得通,但为了改进计量单位转换的理念,您应该乘以 具有物理意义的东西,例如1000.0&lt;KWh/MWh&gt;。经验法则是您的转化价值是否出现在参考书中。用简单的英语,1000.0&lt;KWh&gt; 是没用的,但1000.0&lt;KWh/MWh&gt; 说,“1 MWh 中有 1000 KWh”。
    猜你喜欢
    • 2016-01-31
    • 2010-12-26
    • 2014-03-18
    • 2019-09-15
    • 2014-12-19
    • 1970-01-01
    • 2015-04-28
    • 2012-03-13
    • 2018-11-23
    相关资源
    最近更新 更多