我正在尝试在F#中编写“度量单位”转换器。
我已经定义了两个度量单位KWh
和MWh
,我正在尝试编写一个函数来在两个模式匹配数字类型之间进行转换。我可以有一个浮点数,十进制,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类型时,我无法弄清楚如何在类型上正确分支。
答案 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
(我不确定是否有可能)。我会避免你的运行时匹配,因为它牺牲了静态类型安全(这有点单位)。 (另外,无论如何都不可能对单元进行运行时匹配,因为在编译期间会删除单元。)