Fsharp/如何将(string*FsTree)列表的类型Node更改为2paths不能相同的列表



在FSharp中,我想执行以下

给定类型:type FsTree = Node of (string * FsTree) list

我想定义一个谓词toStringList,以便:toStringList myFsTree给出以下结果

结果:

[
["n1"];
["n2"; "sub_n2_1"];
["n2"; "sub_n2_2"];
["n3"; "sub_n3"; "sub_sub_n3_1"];
["n3"; "sub_n3"; "sub_sub_n3_2"];
["n3"; "sub_n3"; "sub_sub_n3_3"];
["n4"];
]

何处

let myFsT = Node [
("n1", Node []); 
("n2", Node [
("sub_n2_1", Node []);
("sub_n2_2", Node [])
]); 
("n3", Node [
("sub_n3", Node [
("sub_sub_n3_1", Node []); 
("sub_sub_n3_2", Node []); 
("sub_sub_n3_3", Node []); 
])
]); 
("n4", Node [])
]

到目前为止,我所做的(在下面(是绝对不正确的,我知道这一点。但我真的被困在这里了!有人知道该怎么办吗?

let rec test (fst:FsTree) = 
match fst with
| Node []              -> []
| Node ((str, subFst)::restNode) -> 
[[str] @ (test subFst)] @ (test restNode)

这是一个棘手的问题,因为它需要两个相互递归的函数——一个用于Node,另一个用于在Node中的列表。

let rec processNode     prepend node =
let rec processList prepend listOfNodes =
match   listOfNodes with
| []                         -> []
| (str, subNode) :: restList -> 
let restList = processList  prepend restList
let newPrepend = List.append prepend [ str ]
match processNode newPrepend subNode with
| []  -> [ newPrepend ]
| lst -> lst
@ restList
match node with Node listOfNodes -> processList prepend listOfNodes
processNode [] myFsT
|> List.iter print

您需要一个递归函数来遍历列表中的元素:processList

并且另一个用于遍历列表中的子节点:CCD_ 6。

之所以出现这种混乱,是因为processNode所做的只是从Node获取列表,然后调用processList,所以很容易将它们视为一个函数。

OTOH、processList是双递归的。它调用自己来遍历列表中的元素,并调用processNode来深入子树。

还有一个累加器参数需要传递,它是承载路径的prepend

相关内容

  • 没有找到相关文章

最新更新