7

この質問に従って: 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

ここで、2 つの操作で計算できるようにします。だから私はできる

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

現在、これはすべて素晴らしいですが、複数のユニットと複数のプレフィックスをサポートしたい場合はすぐに手に負えなくなります。したがって、これをより一般的なソリューションに焼き付ける必要があると思いますが、どこから始めればよいかわかりません。私は試した

let milliPer<'a> = 1000.0<(milli * 'a) / 'a>

しかし、それは機能しません。なぜなら、f# が不平を言い、「ゼロ以外の定数は一般的な単位を持つことはできません」と言うからです...

単位接頭辞はよくある問題だと思うので、誰かが以前にこの問題を解決したと思います。F# でユニット プレフィックスを行うより慣用的な方法はありますか?

4

1 に答える 1

7

定数は1000.0<(milli second)/second>1 秒あたり 1000 ミリ秒を表すものとして記述しますが、実際には (代数的な単純化としてこれを行うことができます) 「ミリ」は、「ミリ」プレフィックスのない単位を取得するには、任意の単位に 1000 を掛ける必要があることを意味します。

milliPerしたがって、 (and 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です)

于 2012-10-26T18:05:12.087 に答える