我正在学习F#,并且尝试首次使用“计量单位”的概念。我有以下问题:
最后一个let(getPosition函数中的变量y给我以下错误:“度量单位'u ^ 2 m / second'与度量单位'm'不匹配”。公式或这是我的使用os计量单位吗?
我正在使用Microsoft.FSharp.Data.UnitSystems.SI中定义的计量单位。有没有一种方法可以不指定使用名称的较短版本?(例如UnitNames.second对比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)
您可以通过添加一个短名称来使用
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)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句