【发布时间】:2018-11-23 22:42:04
【问题描述】:
我有一个类型定义:
type FsTree = Node of (string * FsTree) list
我创建一个空节点:
let createEmptyFsTree () : FsTree = Node[]
我很想从字符串列表的路径构建一棵树,例如:
let fs1 = create ["MainNode";"nodeA";"nodeB"] (createEmptyFsTree())
let fs2 = create ["MainNode";"nodeC";"nodeD"] fs1
let fs3 = create ["MainNode";"nodeC";"nodeE"] fs2
结果将是:
Node [("MainNode", Node [
("nodeA", Node [("nodeB", Node [])]);
("nodeC", Node [
("nodeD", Node[]);
("nodeE", Node[])])])]
到目前为止,这是我的代码。我被困了2天。请帮忙。
let create (p : string list) (fs : FsTree) =
let rec create (p : string list) (fs : FsTree) =
match fs with
| Node n -> match p, n with
| h :: t, (name, rsNode) :: rsTree when name = h -> Node([(h, (create t rsNode))] @ rsTree)
| _, lNode :: rsTree -> Node([lNode]@rsTree)
| h :: t, [] -> Node ([h, (create t (createEmptyFsTree()))])
| [],[] -> Node[]
create p fs
我只能从传递的第一条路径创建树:
Node [("MainNode", Node [("nodeA", Node [("nodeB", Node [])])])]
【问题讨论】:
-
请注意,您在另一个内部有一个
create。外面的create只调用里面的那个,所以它不会做任何你可以消除那个的事情,结果是一样的。
标签: f# tree filesystems