gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 06:45:27 26 4
gpt4 key购买 nike

我正在尝试用 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 类型时,我无法弄清楚如何正确地对类型进行分支。

最佳答案

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

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

关于基于类型的 F# 度量单位转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3791959/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com