F#测量单位建模度量标准前缀(微,毫,纳米)

时间:2012-10-26 17:49:36

标签: f# units-of-measurement

根据这个问题: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#中是否有更惯用的方法来做单位前缀?

1 个答案:

答案 0 :(得分:7)

你将常量写为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 )