【问题标题】:F# Units of Measurement modeling metric prefix (micro, milli, nano)F# 测量单位建模公制前缀(微、毫、纳米)
【发布时间】:2012-10-17 00:16:51
【问题描述】:

根据这个问题: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

现在,这一切都很好而且很闪亮,但是当您想要支持多个单位和多个前缀时,它会很快失控。所以我认为要么有必要将它烘焙成一个更通用的解决方案,但不知道从哪里开始。我试过了

let milliPer<'a> = 1000.0<(milli * 'a) / 'a>

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

由于我认为单位前缀是一个常见问题,我想以前有人已经解决了这个问题。有没有更惯用的方法在 F# 中做单位前缀?

【问题讨论】:

    标签: f# units-of-measurement


    【解决方案1】:

    您将常量写为1000.0&lt;(milli second)/second&gt;,表示每秒 1000 毫秒,但实际上(您可以将其作为代数简化)“milli”只是意味着您需要将任何单位乘以 1000 才能获得没有“毫”前缀。

    因此,您可以简化您对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)

    【讨论】:

    • 小心仅将其与数据存储类型(例如 KB、MB、GB)一起使用,因为在某些情况下这些使用 base-10 如上所述,而在其他情况下它们使用 base-2,因此转换因子是 1024 而不是 1000。
    猜你喜欢
    • 1970-01-01
    • 2018-03-03
    • 2021-07-04
    • 2013-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-22
    相关资源
    最近更新 更多