我有这样大致做了的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