2015-02-04 4 views
1

저는 객체라는 value라는 변수를 가지고 있습니다. 이제는 값에 두 가지 유형의 튜플이 포함되어 있습니다. (어떤 유형인지는 알지 못합니다.)오브젝트를 터플로 변환하는 방법은 무엇입니까?

참고 : 값이 런타임에만 튜플이라는 것을 알고 있습니다.

{object} 값을 {tuple ('A,'B)}로 변환하려면 어떻게해야합니까?

나는 그것을

type TdlType= 
    |TdlBoolean=0 
    |TdlInteger=1 
    |TdlTag=2 
    |Tdldouble=3 
    |TdlString=4 
    |TdlDecimal=5 
    |TdlChar=6 
    |TdlTuple=7 
and Tdl(_value,_name:string,_valueType:TdlType)= 
    let value:obj=_value 
    let name:string=_name 
    let valueType:TdlType= _valueType 
    member this.valueAsTuple: Option<'A*'B>=if valueType<>TdlType.TdlTuple then 
               None 
              else 
               match value with 
               |(x,y)->Some((x,y)) //The Error is Here 
               |_->None 

을하려고 노력하는 방법

이를하지만이 코드 오류가 :이 표현은

+0

무엇이'TdlType'입니까? –

+0

이것은 내 코드 다 –

답변

1

이됩니까 B 'A *'을 입력 한 여기 유형을 가지고 expcted OBJ되었지만 네가 원하는대로 할거야?

open System 

type TdlType = 
| TdlBoolean = 0 
| TdlInteger = 1 
| TdlTag = 2 
| Tdldouble = 3 
| TdlString = 4 
| TdlDecimal = 5 
| TdlChar = 6 
| TdlTuple = 7 
and Tdl(value : obj, name : string, valueType : TdlType) = 
    member this.GetValueAsTuple<'a, 'b>() = 
     if valueType <> TdlType.TdlTuple then 
      None 
     else 
      match value with 
      | :? Tuple<'a, 'b> as t -> Some (t.Item1, t.Item2) 
      | _ -> None 

샘플 FSI 출력 : 일반적인 참고로

> let x = Tdl("Foo", "Foo", TdlType.TdlString);; 

val x : Tdl 

> x.GetValueAsTuple<string, string>();; 
val it : (string * string) option = None 
> let y = Tdl(("Foo", 42), "Foo", TdlType.TdlTuple);; 

val y : Tdl 

> y.GetValueAsTuple<string, int>();; 
val it : (string * int) option = Some ("Foo", 42) 

, 당신은 약하게 시스템 외부 입력 일부와 상호 작용하고,이 당신의 F # 코드로 해당 시스템에서 데이터를 가져로 시도하지 않는 한 이것은 특히 관용적 인 F # 코드는 아닙니다.

정말로 무엇을하려고합니까? 이것에 대한 동기는 무엇입니까?

+0

XML과 같은 Tdl이라는 파일 구문이 있지만 xml과 tdl의 차이는 xml의 모든 값이 문자열에있는 것입니다. xml에서 값을 읽으려고 할 때 우리는 항상 문자열이고 당신은 사용자가 필요로하는 것을 캐스팅 할 수 있습니다. Tdl은 값을 객체로 저장합니다. 즉, tdl 파일에 int를 저장 한 다음 그 값을 얻으려고하면됩니다. 값은 int로 반환됩니다. 파일과 데이터를 개체로 저장 한 다음 동일한 개체로 가져올 수 있으면 파일과 데이터를 사용하는 것이 매우 쉽습니다. –

+1

OK, 타입이 지정되지 않은 데이터 소스와 상호 작용하고 있습니다 :) FWIW, 문자열 기반 인 경우 [FParsec] (http://www.quanttec.com/fparsec)에서 좀 더 표준화 된 문자열을 파싱하는 방법. 또한 F #에는 [Type Providers] (https://msdn.microsoft.com/en-us/library/hh156509.aspx)라는 기능이 있습니다.이 기능은 데이터를 더 쉽게 읽을 수 있도록하기위한 것입니다. 그러나, 귀하의 형식에 이미 존재하지 않는 한, 그것은 아마도 과잉입니다. –

관련 문제