使用计量单位计算轨迹

时间:2013-08-10 16:40:38

标签: .net f# units-of-measurement

我正在学习F#而我正试图第一次使用计量单位的概念。我有以下问题:

  • 最后一个let(getPosition函数中的变量y给出了以下错误:“度量单位''u ^ 2 m /秒'与度量单位'm'不匹配。”是否存在公式中的错误或者是我的用法度量单位?

  • 我正在使用Microsoft.FSharp.Data.UnitSystems.SI中定义的度量单位。有没有办法不指定使用更短版本的名称? (例如UnitNames.second vs second)。

  • 我必须使用函数cos和sin。这两个函数需要浮点数,而不是浮点数。我使用LanguagePrimitives.FloatWithMeasure将float转换为度量单位。这是唯一的方法吗?它使代码非常详细。

谢谢!

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)

1 个答案:

答案 0 :(得分: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)