2

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

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

4

1 回答 1

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

于 2010-09-25T01:11:48.073 回答