是不是这样说:F# 中没有分数功率单位
5 回答
除了已经说过的内容之外,有关(不仅仅是)F# 度量单位的信息的最佳资源是Andrew Kennedy 的博士论文,他实际设计了 F# 单位。他提到了分数单位:
最重要的决定是是否允许维度的分数指数。反对它们的论点是哲学上的:具有诸如 M 1/2维数的量在物理上没有意义,如果出现这种情况,它会建议修改基本维数集,而不是重新评估积分指数。赞成的论点是务实的:有时更容易编写程序代码来临时创建一个维数具有小数指数的值。本论文以前一种观点为准,不考虑分数指数。但是,大多数理论都适用。任何潜在的差异都会在出现时突出显示。
我认为这本质上是 F# 没有分数单位的原因,因为 F# 的设计非常接近 Andrew Kennedy 的工作,以确保它是合理的。
更新:在 F# 4.0 中,已实现对分数指数的支持
具有分数指数的单位很常见,它们并没有什么特别之处。可能技术界的每个人都遇到过电压噪声密度,它是按每平方 (Hz) 测量的。这在物理上很有意义,噪声功率与带宽成正比,噪声电压是功率的平方,这里没有奇怪的数学。
每次遇到分数幂指数时都创建一个新的基本单位不是正确的方法。
这些单位不是 SI 单位,它们的使用破坏了库的兼容性。如果你将 sqrtHz 定义为一个新单位,而我定义了 rootHz,我们的代码就不能一起工作。无论如何,我需要引入相当多的基本单位才能拥有一套完整的 Hz^-2、Hz^3、Hz^-5,... 顺便说一句,仅仅提供有理指数似乎是更好的选择。Boost.units 就是这样做的。
没有字面上fractional power
的度量单位无论如何都不会打折 F# 单位设施,因为它允许fractional exponent
以相反的方式呈现看似单位关系,而将最小分数作为基本维度:
let takeSqrt (x: float<_>) = sqrt(x)
已经推断出这种方式的签名,float<'u ^ 2> -> float<'u>
避免引入想象中的“自然分数” float<'u> -> float<'u^1/2>
。
let moreComplicated (x: float<_>) (y: float<_>) =
sqrt(x*x + y*y*y)
已推断出 的签名float<'u ^ 3> -> float<'u ^ 2> -> float<'u ^ 3>
,其中所有单位度量转换相对于某些派生的隐式基本维度保持有效float<'u>
。
事实上,下面的这段代码
[<Measure>]type m
let c = sqrt(1.0<m>)
甚至没有与诊断一起编译The unit of measure 'm' does not match the unit of measure ''u ^ 2'
可以被认为是责备或祝福,但清楚地表明单位测量检查已经到位。
编辑:在阅读了 OP 的评论和 Andrew Kennedy 的论文中的例外之后,@nicolas 似乎是正确的——F# 不支持带小数指数的度量单位。
答案不应该像说,是的,赫兹以 s^-2 测量,与 s^(1/2) 相同吗?你去吧。另外,我喜欢使用 的哲学思想,比如 m^(1/2) 如果它出现在计算中,也许有一天会理解该单位在字面意义上的含义。