gpt4 book ai didi

F# 计量单位建模度量前缀(微、毫、纳)

转载 作者:行者123 更新时间:2023-12-04 11:55:46 26 4
gpt4 key购买 nike

根据这个问题:Fractional power of units of measures in F# F# 中的度量单位不支持分数幂。

在我的应用程序中,有时考虑带有度量前缀的数据是有益的,例如当处理秒。有时我需要以毫秒为单位的结果,有时以秒为单位。

我目前正在考虑使用的替代方案是这个

[<Measure>] type milli
[<Measure>] type second

let a = 10.0<second>;
let b = 10.0<milli*second>

这给了我:
val a : float<second> = 10.0
val b : float<milli second> = 10.0

现在我想允许使用这两个操作进行计算。所以我可以做
let milliSecondsPerSecond = 1000.0<(milli*second)/second>

let a = 10.0<second>;
let b = 10.0<milli*second>

(a*milliSecondsPerSecond) + b

这正是我想要的
val it : float<milli second> = 10010.0

现在,这一切都很好而且很 Shiny ,但是当您想要支持多个单位和多个前缀时,它很快就会失控。所以我认为有必要把它变成一个更通用的解决方案,但不知道从哪里开始。我试过
let milliPer<'a> = 1000.0<(milli * 'a) / 'a>

但这不起作用,因为 f# 提示并告诉我“非零常量不能有通用单位”......

由于我认为单位前缀是一个常见问题,因此我想之前有人已经解决了这个问题。在 F# 中是否有更惯用的方法来处理单位前缀?

最佳答案

您将常量写为 1000.0<(milli second)/second>代表每秒 1000 毫秒,但实际上(您可以将其作为代数简化)“milli”仅意味着您需要将任何单位乘以 1000 以获得没有“milli”前缀的单位。

因此,您可以简化 milliPer 的定义(和 milliSecondsPerSecond )只是说:

let milli = 1000.0<milli>

然后可以将其与其他类型的措施一起使用:
(10.0<second> * milli) + 10.0<milli second>   
(10.0<meter> * milli) + 10.0<milli meter>

我认为这不应该导致代码中的任何地方出现任何复杂情况 - 在使用单位时这是一个非常好的模式(我见过人们使用 percent 的单位类似,但转换为 0.01)

关于F# 计量单位建模度量前缀(微、毫、纳),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13091883/

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