我有這樣大致做了的XElement:F#:遞歸樹
<Tasks>
<Task>
<Parent>0</Parent>
<Id>1</Id>
</Task>
<Task>
<Parent>1</Parent>
<Id>2</Id>
</Task>
<Task>
<Parent>1</Parent>
<Id>3</Id>
</Task>
<Task>
<Parent>3</Parent>
<Id>5</Id>
</Task>
[..]
每個任務元素都有唯一的ID,一些信息,我不報告和父ID。父id引用另一個任務,以便可以表示一棵樹。
我已經有一個C#的功能進行排序這樣的結構:
private void SortTask(ref XElement taskOutput, XElement tasks, string parent)
{
var children = from t in tasks.Elements("Task")
where t.Element("Parent").Value == parent
select t;
foreach (XElement task in children.AsEnumerable())
{
taskOutput.Add(task);
SortTask(ref taskOutput, tasks, task.Element("Id").Value);
}
}
這裏我把遞歸調用該函數搜索每個節點的子元素,並加入到一個名爲taskOutput新的XElement。每次我傳遞一個對這個新對象的引用時,當前元素的id(代表下一次調用中的父元素)以及包含所有任務的原始XElement。
現在,我認爲這將是一個很好的測試案例來學習一些關於F#的簡單重寫這個東西的功能,但我遇到了麻煩。
這是我走到這一步:
type TaskManager(taskListXml) =
member o.taskList = XElement.Parse(taskListXml).Elements(XName.op_Implicit("Task"))
member o.Sort =
let parent =
o.taskList
|> Seq.find (fun t -> t.Element(XName.op_Implicit("Parent")).Value.Equals("0"))
let rec doSort t =
let parId = t.Element(XName.op_Implicit("Id")).Value
let children =
o.tasklist
|> Seq.filter (fun x -> x.Element(XName.op_Implicit("Parent")).Value.Equals(parId))
|> Seq.iter (fun x -> Console.WriteLine(x))
|> Seq.iter (fun x -> doSort x)
這並不編譯指定爲讓返回類型(在let children
)有錯誤。
任何幫助讓我更好地理解這一點? 非常感謝你
嗯,它仍然給了我同樣的錯誤.. – pistacchio 2009-07-18 18:18:43
你`o.Sort`函數仍然不會返回任何東西。然而,我不確定你想要在這裏返回什麼,所以你需要自己弄清楚或者修改你的問題。 – Noldorin 2009-07-18 18:25:20