我正在尝试使用 F# 对简单的树结构进行建模,并且不禁认为我做得非常糟糕:
我的树本质上是一个叶子列表(最终将被持久化到数据库表中)。我有一个函数 getChildren 接收叶节点 ID 并递归返回该叶的所有子节点。
open System.Collections.Generic
type leaf = { nodeID : int; nodeDescr : string; parentID : int option}
let myTree = [ { nodeID = 0; nodeDescr = "Root"; parentID = None };
{ nodeID = 1; nodeDescr = "Mechanical"; parentID = Some(0) } ;
{ nodeID = 2; nodeDescr = "Electrical"; parentID = Some(0) } ;
{ nodeID = 3; nodeDescr = "High Voltage"; parentID = Some(2) } ;
{ nodeID = 4; nodeDescr = "Low Voltage"; parentID = Some(2) } ;
{ nodeID = 5; nodeDescr = "HV Maintanence"; parentID = Some(3) } ;
{ nodeID = 6; nodeDescr = "City Power"; parentID = Some(3) } ;
{ nodeID = 7; nodeDescr = "LV Wiring"; parentID = Some(4) } ;
{ nodeID = 8; nodeDescr = "LV Maintanence"; parentID = Some(4) } ]
let getChildren (id : int) (tree : list<leaf>) =
let allChildren = new List<leaf>() // Mutable list
let rec getAllChildren (id : int) (t : list<leaf>) =
let cl = List.filter (fun x -> x.parentID = Some id) t // Get the immediate children
for c in cl do // Loop through the immediate children and recursively get their children
allChildren.Add(c)
getAllChildren c.nodeID t
getAllChildren id tree
allChildren
我在这里的担忧是:
- 我正在使用可变列表
- 我正在使用循环
我怀疑在 F# 中使用函数式编程时有一种更优雅的方法可以避免突变和循环,而且我的命令式编程习惯正在潜移默化。
此外,这是对树结构建模的好方法吗,请记住它需要从数据库表中存储和检索?