是否可以这样说: F#中没有分数幂单位
答案 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),如果它出现在计算中,也许有一天会理解该单位在字面意义上的含义。