2013-08-10 1 views
2

F #을 배우고 있으며 처음으로 측정 단위 개념을 사용하려고합니다. 나는 다음과 같은 질문이 : " '^ 2m/초 U'측정 단위와 일치하지 않는 '측정 단위 다음에서는 getPosition 기능에측정 단위를 사용하여 궤적 계산

  • 마지막하자 (변수 y를하는 것은 나에게 다음과 같은 오류를 제공합니다 수식에 문제가 있거나 사용량 측정 단위가 무엇입니까?

  • Microsoft.FSharp.Data.UnitSystems.SI에 정의 된 측정 단위를 사용하고 있습니다. 방법이 있습니까? (예 : UnitNames.second vs 초)

  • 나는 cos과 sin 함수를 사용해야합니다. 두 함수는 float가 아닌 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) 

답변

3

당신은 당신의 파일에

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

을 추가하여 짧은 이름을 사용할 수 있습니다.

velocity * tabc과 동일한 측정 유형 (미터)이므로 sin 호출의 결과를 측정 유형으로 변환하는 이유는 명확하지 않습니다. 다음 내용이 원하는 것으로 보입니다.

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) 
관련 문제