2010-12-07 5 views
1

F #의 측정 단위에 대한 변환 함수를 쓰고 있습니다. 값에 관한 정보는 ASP.NET 웹 응용 프로그램에서 가져옵니다.측정 단위 "형식"in F #

내가 만드는 오전 함수는 다음과 같이 정의된다 : 문자열 정의 :

let convert (x:float<_>) (toType : string) = 
    // Do conversion here. 

내가으로 실행하고 첫 번째 문제는 toType을 포함한다. float<_> 유형을 받아들이도록 정의 할 수있는 방법이 있습니까? 특히 웹 응용 프로그램에서 오는 것입니까? (나는 그것이 Andrew Kennedy's excellent articles에 따라 CLR의 일부 알고 있지만, 나는 일반적 기능에 그것을 정의하는 방법을 볼 수 없습니다.

감사를 당신이 제공 할 수있는 모든 도움을.

+1

나는 당신이 요구하거나하려는 것을 이해하지 못합니다. – Brian

+0

@Brian - 기본적으로 측정 유형에 따라 값을 변환하고 싶습니다. @ kvb의 답을 바탕으로, 정보가 런타임에 지워지는 것처럼 보이지 않을 수도 있습니다. – JasCav

답변

2

당신은 "2.0 피트"다음 "5.0 m"을 읽을 수 있도록하려면

  • 당신은 예를 들어, 만약 문자열을 구문 분석하고 일부 조건부 논리를 수행하는 코드를 (작성해야

    "피트는"다음 float<ft> 또는 무엇이든)

  • 로 변신 당신은 당신이 형태 보증 방법

에서 일을 할 수있는 F # 형식 시스템으로 변환 된 데이터를 한 번

외부 세계에서 강력한 형식의 데이터를 가져 오기를 원하는 모든 앱에서 일반적으로 사용됩니다. 입력을 구문 분석하고 유효성을 검사하여 강력한 형식의 데이터 구조에 저장해야하는 입력 구성 요소가 있지만 프로그램은 이후에이 데이터를 사용할 수 있습니다.

(임의의 라이브러리에는 마법의 파서/입력 유효성 검사기가 없습니다. 데이터 유형에 대해서만 유효합니다.)

+0

대답 해 주셔서 감사합니다. 이것이 해결책이라고 생각했지만 각 개별 유형에 대한 논리를 작성하는 대신 직접 유형을 전달할 수 있기를 바랬습니다 (유지 관리의 악몽이 될 수 있음). 이 답변을 제공해 주셔서 감사합니다. – JasCav

2

나는 거라고 생각하지 않습니다 런타임에 측정 유형이 지워지기 때문에 원하는 것을 수행 할 수 있습니다. 특히 측정 유형에 대한 런타임 유형 테스트 (F # (:?) 연산자)와 유사한 것은 없습니다

어떤 유형의 로직 convert 함수를 구현하고 싶습니까?

UP 추가 정보를 바탕으로 DATE

당신이 제공 한, 여기에 몇 가지 더 생각입니다

측정 F #의 단위의 요점은 수량이에 사용되는, 컴파일시에, 강제하는 것입니다
  1. 단위에 맞는 방법. 사용자가 float<kg>에서 float<m/s^2>으로 변환하는 것과 같이 무의미한 변환을 시도한 경우 어떻게 될까요? F #의 단위 유형 작업은 정적으로 이와 같은 변환을 방지하는 것입니다. 항상

    [<Measure>] type m 
    [<Measure>] type km 
    
    
    let convert (f:float) (s:string) : float<m> = 
        match s with 
        | "m" -> f * 1.0<m> 
        | "km" -> f * 1.0<km> * 1000.0<km/m> 
        | _ -> failwith (s |> sprintf "Unknown unit of measure: %s") 
    

    이를 : 당신이 간 컨버터블 타입의 알려진 목록이있는 경우

  2. , 당신은 곱셈을 사용하여 비 단위 일반적인 반환 형식 결과 변환을 수행 할 수 있습니다 단위가없는 수량과 그것이 나타내는 단위의 이름에 따라 미터로 결과를 반환합니다.

+0

사용자 입력 데이터가 많은 웹 응용 프로그램 (과학 응용 프로그램)이 있습니다. 그러나 사용자는 데이터의 출처에 따라 다른 단위로 데이터를 입력 할 수 있습니다. 결과적으로 사용자가 작업하려는 단위간에 변환 할 수있게해야합니다. F # 또는 .NET Framework의 일부인 이미 활용할 수 있기를 바랬습니다. 불행히도 FOSS 라이브러리는 일반적으로 옵션이 아닙니다. – JasCav

+0

글쎄,'convert : float <'t> -> float <'u>'은 확실히 의미가 있습니다. 피트를 미터로 변환하는 위의 예는 'let footToMeter (x : float ) = x * 0.3048 '과 같은 주요 후보입니다. 일반 함수는 일반 입력을 특정 유형 (측정 단위 포함)과 비교할 수 있으며 잘못된 변환의 경우 예외를 throw 할 수 있습니다. – Mephane