2010-03-06 4 views
7

Ich bin neu in Haskell, also versuche ich herauszufinden, wie man Baumdurchquerungen macht.Wie transformiert man einen Baum mit Scrap Your Boilerplate?

Hier ist das Unternehmen Beispiel (mit einer leichten Veränderung), die ich in mehreren Zeitungen gesehen haben

data Company = C [Dept]    deriving (Eq, Show, Typeable, Data) 
data Dept  = D Name Manager [Unit] deriving (Eq, Show, Typeable, Data) 
data ThinkTank= TK Name [Unit]   deriving (Eq, Show, Typeable, Data) 
data Unit  = PU Employee | DU Dept deriving (Eq, Show, Typeable, Data) 
data Employee = E Person Salary  deriving (Eq, Show, Typeable, Data) 
data Person = P Name Address   deriving (Eq, Show, Typeable, Data) 
data Salary = S Float    deriving (Eq, Show, Typeable, Data) 
type Manager = Employee 
type Name  = String 
type Address = String 

Was würde ich tun möchte, ist ein Mitarbeiter zu bewegen, von wo er zu einer bestimmten Abteilung ist. Diese Person könnte in einer Abteilung oder einem ThinkTank sein.

Es scheint einfach zu sein, Dinge in SYB zu tun, solange Sie einen Typ machen, aber ich bin mir nicht sicher, wie man mit mehreren Datentypen umgehen soll.

Antwort

5

Sie müssen mit einem SYB Tutorial starten,

Die wichtigsten Traversal-Funktionen sind:

Spielen Sie mit denen, um einen Sinn für die API zu bekommen, und Sie werden es herausfinden.

SYB Generika ist ein bisschen mehr als ein Anfänger Haskell Übung obwohl.

0

Nicht so vertraut mit SYB, so werde ich ein Beispiel mit uniplate stattdessen zeigen. Das Beispiel entfernt nur die Mitarbeitereinheit aus ihrer Abteilung oder Denkfabrik, aber Sie werden wahrscheinlich leicht herausfinden, wie Sie sie erweitern können, um das zu tun, was Sie wollen.

> let jack = E (P "Jack" "The Road") (S 7) 
> import Data.Generics.Uniplate.Data 
> transformBi (filter (/= PU jack)) $ C [D "Operations" (E (P "Charles" "Seattle") (S 700000)) [PU jack]] 
C [D "Operations" (E (P "Charles" "Seattle") (S 700000.0)) []] 
6

Das Tutorial auf cs.uu.nl scheint verschwunden zu sein. Ich kämpfte eine Weile damit, durchforstete Papiere und schrieb dann this tutorial. Ich hoffe, Sie finden es nützlich.