简体   繁体   中英

Enumerate all paths through a rose tree Haskell

I'm working with a version of a Tree of the type:

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

My aim is to get a function that returns a list of pairs [(Event,[Int])] with [Int] being the coordinates (the path taken in the tree to reach it) of each Event, ie if the tree was:

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

Then I would want it to return [event,[0]] . I want to ignore any empty ends to the tree.

so my function looks like

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

Then for Split it needs to recursively apply the function on each subtree. I thought of doing:

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

But this would give me nested lists of arbitrary length, among a couple of other problems. Any ideas?

A possible solution could be:

coords (Split _ xs) = [ (event, n:path)
      | (n,(_,tree)) <- zip [1..] xs 
      , (event, path) <- coords tree  ]

This starts by enumerating the trees in xs , using zip [1..] as done in the OP. We get a list of kind-of triples (n,(string,tree)) , and we do not need the string . For any such "triple", we recurse with coords tree : this produces a list of the form [(event1, path1), (event2, path2), ...] where the paths are relative to tree , not to Split str xs . We need to add n in front of every path, so we finally generate (event, n:path) .

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM