Joh*_*lph 7 f# units-of-measurement
根据这个问题:F#中度量单位的分数幂没有F#中的度量单位支持的分数幂.
在我的应用程序中,有时候使用度量前缀来考虑数据是有益的,例如在处理秒时.有时我需要一毫秒的结果,有时甚至几秒钟.
我正在考虑使用的另一种选择是这个
[<Measure>] type milli
[<Measure>] type second
let a = 10.0<second>;
let b = 10.0<milli*second>
Run Code Online (Sandbox Code Playgroud)
这给了我:
val a : float<second> = 10.0
val b : float<milli second> = 10.0
Run Code Online (Sandbox Code Playgroud)
现在我想允许使用这两个操作进行计算.所以我能做到
let milliSecondsPerSecond = 1000.0<(milli*second)/second>
let a = 10.0<second>;
let b = 10.0<milli*second>
(a*milliSecondsPerSecond) + b
Run Code Online (Sandbox Code Playgroud)
这给了我我想要的东西
val it : float<milli second> = 10010.0
Run Code Online (Sandbox Code Playgroud)
现在,当你想要支持多个单元和多个前缀时,这一切都很好而且有光泽但很快就会失控.所以我认为有必要将其烘焙成更通用的解决方案,但不知道从哪里开始.我试过了
let milliPer<'a> = 1000.0<(milli * 'a) / 'a>
Run Code Online (Sandbox Code Playgroud)
但这不起作用,因为f#抱怨并告诉我"非零常数不能有通用单位"......
由于我认为单位前缀是一个常见问题,我想有人之前已经解决了这个问题.在F#中是否有更惯用的方法来做单位前缀?
您将常量写1000.0<(milli second)/second>为每秒1000毫秒,但实际上(您可以将此作为代数简化)"milli"只意味着您需要将任何单位乘以1000以获得没有"milli"前缀的单位.
因此,您可以简化milliPer(和milliSecondsPerSecond)的定义,只需说:
let milli = 1000.0<milli>
Run Code Online (Sandbox Code Playgroud)
然后可以将其与其他措施一起使用:
(10.0<second> * milli) + 10.0<milli second>
(10.0<meter> * milli) + 10.0<milli meter>
Run Code Online (Sandbox Code Playgroud)
我认为这不会导致代码中的任何复杂问题 - 在使用单位时这是一个非常精细的模式(我看到人们使用percent类似的单位,但转换为0.01)