枚举通过玫瑰树Haskell

时间:2018-03-20 13:00:13

标签: haskell recursion functional-programming tree multiway-tree

我正在使用该类型的树版本:

Tree = Empty | Leaf Event | Split String [(String, Tree)]

我的目标是获取一个函数,该函数返回一对[(Event,[Int])]的列表,其中[Int]是每个事件的坐标(在树中获取的路径),即树是:

Split str [(str2, Leaf event), (str3, Empty)]

然后我希望它返回[event,[0]]。我想忽略树的任何空端。

所以我的功能看起来像

coords :: Tree -> [(Event,[Int])]
coords Empty = []
coords (Leaf event) = [event, []]

然后对于Split,它需要递归地在每个子树上应用该函数。我想到了:

coords Split str xs = zip (coords trees) [1..] where
    trees = [snd(str,tree) | (str,tree) <-xs]

但这会给我一些任意长度的嵌套列表,以及其他一些问题。有什么想法吗?

1 个答案:

答案 0 :(得分:2)

可能的解决方案可能是:

Car.class

首先使用@Override public String toString() { return this.name + "[" + this.barcode + "]"; }中的树来枚举coords (Split _ xs) = [ (event, n:path) | (n,(_,tree)) <- zip [1..] xs , (event, path) <- coords tree ] 中的树,如在OP中所做的那样。我们得到了一系列三元组xs,我们不需要zip [1..]。对于任何此类“三元组”,我们会使用(n,(string,tree))递归:这会生成string形式的列表,其中路径相对于coords tree,而不是[(event1, path1), (event2, path2), ...]。我们需要在每条路径前添加tree,因此我们最终会生成Split str xs