我正在使用该类型的树版本:
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]
但这会给我一些任意长度的嵌套列表,以及其他一些问题。有什么想法吗?
答案 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
。