2012-02-23 5 views
2

우리는 같은 측정 단위 정의하는 경우 : 측정과 다음유지 장치

[<Measure>] type s 

및 정수를

let t = 1<s> 

다음은 float로 변환

let r = float t 

측정 유형이없는 r = 1.0이 표시됩니다. 이것은 모든 측정 정보가 손실 되었기 때문에 매우 이상하게 보입니다.

당신이 바로 그 유형을 적용

let inline floatMeasure (arg:int<'t>) : (float<'t>) = 
    LanguagePrimitives.FloatWithMeasure (float arg) 

처럼 뭔가 float로 다시 변환 LanguagePrimitives.FloatWithMeasure를 사용할 수 있지만,이 측정 단위 (HTTP에 대한 문서로 최적의 솔루션처럼 생각하지 않습니다 //msdn.microsoft.com/en-us/library/dd233243.aspx) 상호 운용성 계층을 작성하기위한, 당신은 단위로 값을 단위없는 값을 변환하는 데 사용할 수있는 몇 가지 명시 적 기능도있다, 그러나

말 . 이들은 Microsoft.FSharp.Core.LanguagePrimitives 모듈에 있습니다. 예를 들어, 단위가없는 float에서 float로 변환하려면 다음 코드와 같이 FloatWithMeasure를 사용합니다.

이 코드는 F # 코드에서이 함수가 사용되지 않아야 함을 나타냅니다.

더 많은 관용적 인 방법이 있습니까?

답변

1

(경고 :. 나는 많은 분노 단위를 사용하지 않는 한)

생각 예를 들어, 사용에 대한 부정적인 그 FloatWithMeasure은 단위 주조 측면 (unitless에서 unitful)입니다. 이것은 숫자 표현의 주연과 개념적으로 직각이라고 생각합니다 (예 : int ~ float). 그러나 (나는 생각한다) unit-ful 값에 대해 수치 표현 캐스팅을 수행하는 라이브러리 함수가 없다. 아마도 이것은 대부분의 단위 값이 실제 연속 값을 모델링한다는 사실을 반영합니다. 따라서 int과 같은 개별 표현이 일반적으로 사용되지 않습니다 (예 : 1<s>은 틀림없이 1.0<s>을 의미합니다).

그래서 '캐스트 표현'을하고 '단위를 재조정'하는 것이 좋겠지 만 처음에는 다른 표현을 사용하여 값을 얻은 방법이 궁금합니다. 도메인에 대한 표현이 일반적으로 일반적이기 때문에 (예 : 도처에 float을 사용하십시오).

(어쨌든, 당신의 표현 양식을 바꾸는 것이 필요하다면 직접적으로 표현할 수있는 방식으로 표현 측면에서 유닛 측면을 혼란스럽게하는 귀하의 floatMeasure 기능을 좋아합니다.)

+0

여기에 귀하의 요지가 있습니다. 나는 내가 이산 시간 단계 (int가 좋음)에서 simularion을 앞으로 내딛었지만, 내 방정식의 일부에서 총 시간을 사용하여 이것을 자른 것이라고 덧붙였다. 아마 진짜 대답은'int'를 전혀 사용하지 않는 것입니다. –

1

다음 작업 조각은 당신이 비록 필요에서 경고 정확히 않습니다이다

표준 입력 (9,48) : 경고 FS0042 :이 구조가되지 않습니다 : 그것은 단지 F 번호 라이브러리에 사용))입니다 :

[<NoDynamicInvocation>] 
let inline convert (t: int<'u>) : float<'u> = (# "" t : 'U #) 

[<Measure>] type s 
let t = 1<s> 
let t1 = convert t // t1: float<s> 

그러나, 나는이 방법을 제안하지 않을 것입니다.
우선 UoM은 컴파일 타임이고 유형 변환 let r = float t은 런타임입니다. 호출 할 때 int -> floatint<s> 또는 int<something_else>인지 알 수 없습니다. 따라서 런타임에 적절한 float<'u>을 유추 할 수 없습니다..

또 다른 생각은 UoM의 철학이 설명 된 것보다 더 광범위하다는 것입니다. 컴파일러를 말하는 것과 같습니다. "음, int이지만, int<s>"으로 처리하십시오. 목표는 부적절한 사용을 피하는 것입니다 (예 : int<s>int<hours>에 추가).
때로는 int -> float 변환의 의미가 없습니다. int<ticks>을 생각하면 float<ticks>의 의미가 없습니다.

Further reading은이 기사를 가리키는 데 @kvb를 사용합니다.

+0

'let t1 : float = unbox float t'도 작동하지만 일반적이지 않습니다. – bytebuster