繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM