Как сбросить obj в xml в F # - PullRequest
       33

Как сбросить obj в xml в F #

0 голосов
/ 15 июня 2010

Я пытаюсь преобразовать код C # в F #.
Но не получилось.
Вот код C # из болгпоста под названием LINQ Сокращает число строк и делает код "Pop"

Это примерно FP.

Я перевожу это на

#r "System.Core.dll"
#r "System.Xml.Linq.dll"

open System
open System.Reflection
open System.Collections
open System.Collections.Generic
open System.Xml.Linq

let (|V|S|A|O|) o =
    if o.GetType().IsValueType then V
    elif o.GetType()=typeof<string> then S
    elif o.GetType().IsArray then A
    else O

let rec obj2xml r o =
    match o with
    | V | S -> new XElement(r, o)
    | A -> o |> Array.map (fun z -> obj2xml r z)
    | O -> new XElement(r, o.GetType().GetProperties() |> Array.map (fun z -> obj2xml (z.Name) (z.GetValue(o, null))))

|V |S -> новый XElement (r, o) вернуть a XElement
|A -> o |> Array.map (забавно z -> obj2xml rz) вернуть Array
Я не мог понять это!
Я еще не выполнил его!

Помогите мне, пожалуйста!

1 Ответ

4 голосов
/ 15 июня 2010

Причина, по которой он не скомпилируется, заключается в том, что все ветви match должны возвращать один и тот же тип объекта. Ваш текущий код возвращает либо XElement, либо Array. Поскольку имя функции obj2xml, я думаю, что правильный тип - XElement.

Это означает, что вам нужно каким-то образом обернуть массив в XElement. Я собираюсь предположить, что r является сокращением от «root» и что, поскольку все остальные возвращенные XElements имеют r в качестве первого аргумента, вы должны передать это.

| A -> o |> Array.map (fun z -> obj2xml r z)
// change to:
| A -> new XElement(r, o |> Array.map (fun z -> obj2xml r z))

Кстати, я не знаю, используете ли вы Visual Studio для написания этого кода. Если да, то вы, вероятно, захотите указать свои ссылки через систему проекта, а не #r директивы компилятора.

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