2

私は 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)
4

1 に答える 1

3

を追加することで、短い名前を使用できます。

open Microsoft.FSharp.Data.UnitSystems.SI.UnitNames

あなたのファイルに。

sinエラーに関しては、呼び出しの結果を測定タイプに変換する理由が明確ではありません。これvelocity * tは、測定タイプ (メートル) が と同じであるためabcです。以下はあなたが望むもののようです:

open System
open Microsoft.FSharp.Data.UnitSystems.SI
open Microsoft.FSharp.Data.UnitSystems.SI.UnitNames

module GeneralBallisticTrajectory = 
    [<Measure>] type radian

    let gravitationalAcceleration : float<metre/second^2> = 9.80665<metre/second^2>

    let getPosition (angle: float<radian>) (velocity: float<metre/second>)  (t: float<second>) =
        let x = velocity * t * (cos (float angle) |> LanguagePrimitives.FloatWithMeasure<metre/second>)
        let abc = (0.5 * gravitationalAcceleration) * t * t // returns float<UnitNames.metre>

        let y = (velocity * t * (sin (float angle))) - abc
        (x, y)
于 2013-08-10T17:13:48.373 に答える