F# 计量单位建模度量前缀(微、毫、纳)

标签 f# units-of-measurement

根据这个问题: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

现在,这一切都很好而且很 Shiny ,但是当您想要支持多个单位和多个前缀时,它很快就会失控。所以我认为有必要把它变成一个更通用的解决方案,但不知道从哪里开始。我试过
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)

关于F# 计量单位建模度量前缀(微、毫、纳),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13091883/

相关文章:

asynchronous - F# Async.FromBeginEnd 不应该调用 End 函数?

css - CSS rem 单位有多精细?

多单位转换的C#数据结构

function - 使用 F# 优化记录中的函数值访问

f# - 如何在 F# 语言中暂停控制台

f# - 有没有办法将 llvm 位代码加载到 Mono (F#)

f# - 如何将 "Hello ML.NET World"示例翻译成 F#?

python - 在 Python 中将字符串中的数字与单位分开

ruby-on-rails - 是否有任何在 Rails 上翻译测量单位的解决方案?

jquery - 移动所有网站内容的下拉菜单