2013-05-05 9 views
5

Mam strukturę danych, która reprezentuje podpis typu, ta struktura danych jest drzewem zilustrowanym na pierwszym obrazie jako czerwonym. Chciałabym dostać tę czarną i do tej pory mam tylko pomarańczową (drugie zdjęcie), które jest drzewem typu, ale skojarzonym z lewą.Przepisywanie drzew

enter image description here

Oto drzewo pomarańczowe mam tak daleko (wykonaj strzałki pomarańczowe)

enter image description here

miałem rozwiązać ten problem przez dość drukowania drzewo a następnie analizowania go z kombinator parserów, ale ta nieskuteczność nie jest pożądana. Myślę, że mogę mieć inny algorytm do konwersji z drzewa pomarańczowego na czarny, ale byłoby lepiej, gdyby zamiast komponować dwa algorytmy, mógłbym napisać tylko jeden.

Oznaczę to jako Haskell, ponieważ piszę na ten temat moje rozwiązanie. Mogę podać kod, aby uzyskać strukturę danych, taką jak czerwone drzewo, ale myślę, że to tylko skomplikowałoby próbę rozwiązania ..

Chciałbym wiedzieć, czy istnieje nazwa tego algorytmu i/lub nazwa pozycji operatora w czerwonym drzewie. Czy to prefiks?

Dzięki.

+7

Co masz to '(a -> b) -> c'. To, co masz, to '(a -> b) -> c'. To, czego chcesz, to 'a -> (b -> c)'. Myślę, że popełniłeś błąd, decydując, jaki rezultat chcesz osiągnąć. –

+0

@ DanielFischer Rzeczywiście, postanowiłem teraz chcieć rezultatu, który chciałem z pomocą stosów, dzięki za przeczytanie mojego bałaganu –

Odpowiedz

4

Zapoznaj się ze schematami rekursji. Jest powiązany pytanie tutaj, że zawiera mnóstwo linków:

Recursion schemes for dummies?

Wszystkie linki na tej kwestii są bardzo dobre, ale myślę, że szczególnie patrzeć na slajdach Tima Williamsa (link w mojej odpowiedzi na to pytanie) dla konkretnych implementacji różnych wzorów rekursji (większość z nich jest demo na strukturach drzewiastych).