考虑以下类型来表示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
答案 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
很高兴看到更多解决方案:)