言うのは本当ですか : F# には分数べき乗単位はありません
5 に答える
すでに述べたことに加えて、F# 測定単位 (だけでなく) に関する情報を得るのに最適なリソースは、F# 単位を実際に設計したアンドリュー・ケネディの博士論文です。彼は分数単位について言及しています:
最も重要な決定は、次元の小数指数を許可するかどうかです。それらに反対する議論は哲学的です: M 1/2のような次元を持つ量は物理的に意味をなさず、そのようなことが起こった場合、整数指数の再評価ではなく基本次元のセットの改訂を示唆するでしょう. 賛成の議論は実用的です。次元が分数指数を持つ値を一時的に作成するプログラム コードを記述する方が簡単な場合があります。この論文では、前者の見解が優勢であり、分数指数は考慮されていません。ただし、ほとんどの理論はまったく同じように適用されます。潜在的な相違点は、発生時に強調表示されます。
これが基本的に、F# に分数単位がない理由だと思います。なぜなら、F# の設計は、それが適切であることを確認するためのアンドリュー・ケネディの作業に非常に厳密に従っているからです。
更新: F# 4.0 では、小数指数のサポートが実装されました。
分数指数を持つ単位は非常に一般的であり、特別なことは何もありません。おそらく、テクノロジーに携わる誰もが、sqrt(Hz) あたりで測定される電圧ノイズ密度に遭遇したことがあるでしょう。これは物理的に非常に理にかなっています。ノイズ パワーは帯域幅に比例し、ノイズ電圧はパワーの sqrt です。奇妙な数学はありません。
分数べき乗指数に遭遇するたびに新しい基本単位を作成することは、正しいアプローチではありません。
これらの単位は 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^(1/2) と同じ s^-2 で測定されます。いこうぜ。また、私は を使用するという哲学的なアイデアが好きです。たとえば、m^(1/2) が計算で出てきた場合は、その単位が文字通りの意味で何を意味するかを理解する日が来るかもしれません。