2009-07-10 32 views
2

私はこの例(Rob Pickeringの"Foundations of F#"のp137から)を実行しようとしていますが、最新のF#CTPで動作するようにはできません。F#Reflectionライブラリの使用方法を教えてください。

私はそれが

Value.GetInfo(x) 

これが発生し3行目に「価値」の定義が欠けているように見える:

エラーFS0039:名前空間またはモジュール「の値が」です定義されていません。

これがどこから来ているのか、これが今や別のやり方であれば、新しい構文は誰に教えてくれますか? (優しくして - これは、F#と私の最初のプレイである)

ここで私はから働いている例です: - 私はあなたの関数は、現在の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

。 あなたの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)