2010-06-15 56 views
0

我嘗試將C#代碼轉換爲F#。
但faild。
這是來自bolgpost的C#代碼LINQ Reduces Line Counts and Makes Code 「Pop」如何在F#中將obj轉儲到xml#

這是關於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 - > new XElement(r,o) return a XElement
| A - > o |> Array.map(fun z - > obj2xml r z) return a Array
我搞不​​明白了!
我還沒有得到它的遵守!

請幫幫我!

+5

「它不起作用」不會讓你對SO非常感興趣。 – 2010-06-15 10:32:52

+0

「不起作用」是什麼意思?你的意思是它的功能不正確,或者它不能編譯/編譯? – ChrisBD 2010-06-15 10:35:11

回答

4

它不會編譯的原因是match的所有分支都必須返回相同類型的對象。您當前的代碼返回XElementArray。由於該函數的名稱是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