Haskell:玫瑰树名单

时间:2014-02-08 00:31:26

标签: list haskell tree higher-order-functions

考虑以下类型来表示Rose树:

data RTree a = No a [RTree a]

考虑功能

tolist a = tolistAux 1 a
     where tolistAux n (No x l) = (x,n) : (concat (map (tolistAux (n+1)) l))

我需要定义第一个函数的反函数:unlist :: [(a,Int)] -> RTree a

这样unlist (tolist a) = a

1 个答案:

答案 0 :(得分:1)

这是我找到的解决方案。

我意识到如果在(a,b)中,b == 1那么我创建一个No a(...) 因此,我有一个列表,并将此列表隔离成几个以(a,1)开头的列表,首先减去1到b。 然后,我使用递归创建树(例如,地图函数):

unlist ((x,1):t) = No x l3
where l1 = map (\(a,b) -> (a,b-1)) t
  l2 = isolate1 l1
  l3 = map unlist l2

isolate1 :: [(a,b)]->[[(a,b)]] --note that the result of isolate1 is a list of lists of pairs
isolate1 [] = []
isolate [x]=[[x]]
isolate1 ((a,b):t) = let (x:xs):ys = isolate1 t  
                     in |b==1 = ((a,b):x:xs):ys
                        |otherwise = [(a,b)]:(x:xs):ys

很高兴看到更多解决方案:)