私は F# を学んでおり、測定単位の概念を初めて使用しようとしています。次の質問があります。
最後の let (getPosition 関数の変数 y で、次のエラーが表示されます。「測定単位 ''u ^ 2 m/second' は測定単位 'm' と一致しません。式に何か問題がありますか?それは私の使用OSの測定単位ですか?
Microsoft.FSharp.Data.UnitSystems.SI で定義されている測定単位を使用しています。名前の短いバージョンの使用を指定しない方法はありますか? (例: UnitNames.second と second)。
関数 cos と sin を使用する必要があります。これら 2 つの関数は、float ではなく、float を想定しています。私は、LanguagePrimitives.FloatWithMeasure を使用して、フロートを測定単位に変換します。これが唯一の方法ですか?コードが非常に冗長になります。
ありがとう!
open System
open Microsoft.FSharp.Data.UnitSystems.SI
module GeneralBallisticTrajectory =
[<Measure>] type radian
let gravitationalAcceleration : float<UnitNames.metre/UnitNames.second^2> = 9.80665<UnitNames.metre/UnitNames.second^2>
let getPosition (angle: float<radian>) (velocity: float<UnitNames.metre/UnitNames.second>) (t: float<UnitNames.second>) =
let x = velocity * t * (cos (float angle) |> LanguagePrimitives.FloatWithMeasure<UnitNames.metre/UnitNames.second>)
let abc = (0.5 * gravitationalAcceleration) * t * t // returns float<UnitNames.metre>
// The unit of measure 'UnitNames.metre' does not match the unit of measure 'UnitNames.metre ^ 2/UnitNames.second'
let y = (velocity * t * (sin (float angle) |> LanguagePrimitives.FloatWithMeasure<UnitNames.metre/UnitNames.second>)) - abc
(x, y)