【问题标题】:Compute trajectory using unit of measure使用测量单位计算轨迹
【发布时间】:2013-08-12 09:57:05
【问题描述】:

我正在学习 F#,并且我第一次尝试使用度量单位的概念。我有以下问题:

  • 最后一个 let(getPosition 函数中的变量 y 给了我以下错误:“测量单位 ''u ^ 2 m/second' 与测量单位 'm' 不匹配”。有没有公式有问题还是我使用的度量单位?

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

  • 我必须使用函数 cos 和 sin。这两个函数需要一个浮点数,而不是浮点数。我使用 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)

【问题讨论】:

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


    【解决方案1】:

    您可以通过添加

    来使用较短的名称
    open Microsoft.FSharp.Data.UnitSystems.SI.UnitNames
    

    到你的文件。

    至于错误,不清楚为什么要将sin 调用的结果转换为度量类型,因为velocity * tabc 具有相同的度量类型(米)。以下似乎是您想要的:

    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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多