F#基于类型的度量转换单位

时间:2010-09-25 00:48:55

标签: f# units-of-measurement

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

我已经定义了两个度量单位KWhMWh,我正在尝试编写一个函数来在两个模式匹配数字类型之间进行转换。我可以有一个浮点数,十进制,KWh的int转换为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类型时,我无法弄清楚如何在类型上正确分支。

1 个答案:

答案 0 :(得分:3)

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

[<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(我不确定是否有可能)。我会避免你的运行时匹配,因为它牺牲了静态类型安全(这有点单位)。 (另外,无论如何都不可能对单元进行运行时匹配,因为在编译期间会删除单元。)