F#中度量单位的分数幂

时间:2012-07-04 17:08:10

标签: f# units-of-measurement

是否可以这样说: F#中没有分数幂单位

5 个答案:

答案 0 :(得分:11)

除了已经说过的内容之外,关于(不仅仅)F#测量单位的信息的最佳资源是Andrew Kennedy's PhD thesis,他们实际设计了F#单位。他提到了分数单位:

  

最重要的决定是否允许分数指数   尺寸。反对他们的论点是哲学的:带有数量的数量   诸如M 1/2 之类的维度在物理上是没有意义的,如果出现这样的事情,它就会出现   建议修改基本维度集,而不是重新评估   积分指数。赞成的论点是务实的:有时它更容易   编写临时创建维度值的程序代码   分数指数。在这篇论文中,前一种观点占主导地位,而且是分数   指数不被考虑。但是,大多数理论都适用于   相同;任何潜在的差异在出现时都会突出显示。

我认为这基本上就是为什么F#没有分数单位的原因,因为F#设计非常紧跟安德鲁肯尼迪的工作,以确保它是合理的。

更新:使用F#4.0,对小数指数的支持为implemented

答案 1 :(得分:5)

具有小数指数的单位非常常见,并且没有什么特别之处。 技术上的每个人都可能遇到电压噪声密度,每平方米(Hz)测量一次。 这在物理上很有意义,噪声功率与带宽成正比,而噪声电压是功率的平方,这里没有奇怪的数学。

每次遇到分数幂指数时创建一个新的基本单位不是正确的方法。

这些单位不是SI单位,它们的使用会破坏图书馆的兼容性。 如果将sqrtHz定义为新单位并定义rootHz,则我们的代码无法一起工作。 无论如何,我需要引入相当多的基本单元才能拥有一套完整的基础单元 Hz ^ -2,Hz ^ 3,Hz ^ -5,...... 提供合理的指数似乎是更好的选择,顺便说一句。 Boost.units就是这么做的。

答案 2 :(得分:2)

缺少字面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'可以被视为一种责备或祝福,但这清楚地表明单位度量检查已经到位。

答案 3 :(得分:0)

编辑:在阅读了OP的评论和Andrew Kennedy的论文之后,看来@nicolas是正确的 - F#不支持带小数指数的度量单位。

答案 4 :(得分:-2)

答案不应该像说的一样容易,是的,赫兹是用s ^ -2测量的,它与s ^(1/2)相同?你去吧。 另外,我喜欢使用的哲学思想,比如m ^(1/2),如果它出现在计算中,也许有一天会理解该单位在字面意义上的含义。