7

根据这个问题: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# 中做单位前缀?

4

1 回答 1

7

您将常数写1000.0<(milli second)/second>为每秒 1000 毫秒,但实际上(您可以将其作为代数简化)“milli”只是意味着您需要将任何单位乘以 1000 以获得没有“milli”前缀的单位。

因此,您可以简化milliPer(and 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)

于 2012-10-26T18:05:12.087 回答