3 次元のベクトルと測定単位を処理するための F# モジュールを定義したとします。
[<Measure>]
type m
[<Measure>]
type s
[<Measure>]
type v = m/s
[<Measure>]
type rad
type Vector3<[<Measure>] 'a> =
{
X : float<'a>
Y : float<'a>
Z : float<'a>
}
そして、どこかにラジアンで表された角度があります:
let angle:float32<rad> = 0.5f<rad>
次に、角度を使用して Vector3 (速度) を宣言し、そのコンポーネントを計算する必要があります。私は次のようなものを試しました:
let velocity : Vector3<m/s> = { X = Math.Cos(angle);Y = Math.Sin(angle);Z = 0.0<m/s>} //don't compile
Vector3 は X と Y の値を期待しているが、Sin は float を返すため、上記のコードはコンパイルされません。
どうすればこの問題を解決できますか? 可能であれば、角度を速度に変換するときにコンパイラが正しいことを行うことを保証できるように、キャストの代わりに測定単位間の変換を実行したいと思います。
なにか提案を?