Как мне использовать библиотеку F # Reflection? - PullRequest
3 голосов
/ 10 июля 2009

Я пытаюсь следовать этому примеру (из стр. 137 книги Роберта Пикеринга "Основы F #" ), но не могу заставить ее работать с последней F # CTP.

Кажется, мне не хватает определения 'Value' в 3-й строке, где оно имеет значение

Value.GetInfo(x)

Это генерирует:

ошибка 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)

Ответы [ 3 ]

4 голосов
/ 10 июля 2009

Библиотека отражений F # была переписана для Beta 1 или CTP.Вот ваш код, слегка измененный для использования новой библиотеки и во избежание использования F # PlusPack (print_string для совместимости с OCaml).

2 голосов
/ 10 июля 2009

Или, если вы предпочитаете использовать match для декомпозиции кортежа, попробуйте использовать активный шаблон. Преимущество в том, что вы можете довольно легко добавить поддержку дополнительных типов.

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)
1 голос
/ 10 июля 2009

Я не знаю, была ли ваша функция переименована или удалена в текущих версиях F #. Вы должны взглянуть на FSharp.Reflection в проводнике объектов вашей IDE, чтобы проверить это и, возможно, прочитать эту страницу .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...