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