2009-07-10 4 views
2

Я стараюсь следовать этому примеру (из p137 книги Роба Пикеринга "Foundations of F#"), но я не могу заставить его работать с последним F # CTP.Как использовать библиотеку F # Reflection?

Я, кажется, отсутствует определение «стоимости» на 3-й линии, где он делает

Value.GetInfo(x) 

Это создает: FS0039

ошибки: Пространство имен или модуля «Value» является не определен.

Может ли кто-нибудь сказать мне, откуда это происходит или что нового синтаксис, если это сейчас сделано по-другому? (Быть нежным - это моя первая игра с 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 # была переписана либо для Бета 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 # , Вы должны взглянуть на FSharp.Reflection в проводнике объектов IDE, чтобы проверить это и, возможно, прочитать 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) 
Смежные вопросы