2009-07-10 3 views
2

Rob Pickering의 "Foundations of F#" 도서의 p137에서이 예제를 따르려고하지만 최신 F # CTP로 작동하지 않습니다.F # Reflection 라이브러리는 어떻게 사용합니까?

내가이 생성

Value.GetInfo(x) 

수행하는 3 줄에 '가치'의 정의 누락 된 것으로 나타납니다

오류 FS0039를 : 네임 스페이스 또는 모듈 '가치'입니다 정의되지 않았습니다.

지금이 상황이 다르게 수행되는 경우 어디에서오고 있으며 새로운 구문이 무엇인지 알 수 있습니까? (부드럽게 -이 F 번호와 첫 경기 인)

저는 여기에서 일하고 예입니다 : -

#light 
open Microsoft.FSharp.Reflection 
let printTupleValues x = 
    match Value.GetInfo(x) with 
    | TupleValue vals -> 
    print_string "(" 
    vals 
    |> List.iteri 
     (fun i v -> 
      if i <> List.length vals - 1 then 
       Printf.printf " %s, " (any_to_string v) 
      else 
       print_any v) 
    print_string ")" 
    | _ -> print_string "not a tuple" 

printTupleValues ("hello world", 1) 

답변

4

F # 반영 라이브러리는 Beta 1 또는 CTP로 다시 작성되었습니다. 여기에 새로운 라이브러리를 사용하고 F # PlusPack (print_string은 OCaml과의 호환성)을 사용하지 않기 위해 코드가 약간 변경되었습니다.

open Microsoft.FSharp.Reflection 

let printTupleValues x = 
    if FSharpType.IsTuple(x.GetType()) then 
     let s = 
      FSharpValue.GetTupleFields(x) 
      |> Array.map (fun a -> a.ToString()) 
      |> Array.reduce (fun a b -> sprintf "%s, %s" a b) 
     printfn "(%s)" s 
    else 
     printfn "not a tuple" 

printTupleValues ("hello world", 1) 
0

내가 함수 이름을 변경하거나 현재 F 번호 버전에서 제거되었는지 여부를 모른다는 . IDE의 객체 탐색기에서 FSharp.Reflection을보고 확인해야하며 this page을 읽어야합니다.

2

또는 일치를 사용하여 튜플을 분해 한 다음 활성 패턴을 사용해보십시오. 장점은 추가 유형에 대한 지원을 아주 쉽게 추가 할 수 있다는 것입니다.

open Microsoft.FSharp.Reflection 

let (|ParseTuple|_|) = function 
    | o when FSharpType.IsTuple(o.GetType()) -> 
     Some(FSharpValue.GetTupleFields(o)) 
    | _ -> None 

let printTupleValues = function 
    | ParseTuple vals -> 
     let s = 
      vals 
      |> Array.map (fun a -> a.ToString()) 
      |> Array.reduce (fun a b -> sprintf "%s, %s" a b) 
     printfn "(%s)" s 
    | _ -> 
     printf "not a tuple" 

printTupleValues ("hello world", 1) 
관련 문제