![](/img/trans.png)
[英]Defining generic conversion to and from measurement units in F# to their underlying types
[英]F# Units of Measurement modeling metric prefix (micro, milli, nano)
根据这个问题: 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#中是否有更惯用的方法来做单位前缀?
您将常量写为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)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.