.net - 使用测量单位计算轨迹

标签 .net f# units-of-measurement

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

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

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

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

最佳答案

您可以通过添加

来使用较短的名称
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)

关于.net - 使用测量单位计算轨迹,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18164121/

相关文章:

c# - 常量字符串数组

f# - 在 F# 中使用字符串路径要求 dll

syntax - 使用替代类语法在构造函数中添加代码

ios - Xcode中的度量单位是什么

html - 我应该在我的 CSS 中使用 px 还是 rem 值单位?

iphone - 本地化 - 美国居民的码数或英尺数?

c# - 获取用于转换为 base 64 字符串的图像路径

c# - 字典中对象的默认值

c# - 以角度调用后 WebApi 'Multiple actions were found that match the request' 错误

f# - 我可以提供一个类型作为 F# 中类型提供程序的输入吗?