2012-10-26 9 views
7

Fractional power of units of measures in F# 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回の操作で計算をできるようにしたいです。だから私は、私が今

val it : float<milli second> = 10010.0 

を望んでいた、まさに私を与える

let milliSecondsPerSecond = 1000.0<(milli*second)/second> 

let a = 10.0<second>; 
let b = 10.0<milli*second> 

(a*milliSecondsPerSecond) + b 

を行うことができ、これはすべてが素晴らしく、光沢がありますが、あなたが複数のユニットと複数のプレフィックスをサポートしたいときにすぐに手に負えなく成長します。ですから、これをより汎用的なソリューションにする必要があると思いますが、どこから始めたらいいのか分かりません。私は、私は

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

を試してみましたが、私はその単位の接頭辞が共通の問題であると想像するので、それは

... F#は不平を言うと私に語ったので、「非ゼロの定数は、一般的な単位を持つことができません」動作しません。前に誰かがこの問題を解決したと想像してください。 F#でユニット接頭辞を行うより慣れた方法はありますか?

答えて

7

定数は、毎秒1000ミリ秒を表す1000.0<(milli second)/second>と書いてありますが、実際には(代数的簡約化でこれを行うことができます) "milli"は、単位を1000倍して "milli "プレフィックス。

ので、あなただけの言うことをmilliPer(およびmilliSecondsPerSecond)のあなたの定義を簡素化することができます:

(10.0<second> * milli) + 10.0<milli second> 
(10.0<meter> * milli) + 10.0<milli meter> 

私は思う:

let milli = 1000.0<milli> 

をそれから対策の他の種類とそれを使用することが可能ですこれはコード内のどこにでも合併症を引き起こしてはいけません。ユニットと一緒に作業するときは完璧なパターンです(percentのユニットを使っている人も同様ですが、変換は0.01です)

+0

これは、データ保存タイプ(例: KB、MB、GB)は、上記のようにベース10を使用し、その他のコンテキストではベース2を使用するため、変換係数は1000の代わりに1024になります。 –