2010-03-06 10 views
7

Soy nuevo en Haskell, así que estoy tratando de descubrir cómo hacer recorridos de árboles.Cómo transformar un árbol utilizando Chatarra ¿Su texto repetitivo?

Aquí está el ejemplo de la empresa (con un ligero cambio) que he visto en varios trabajos

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 

Lo que me gustaría hacer es mover un Empleado de donde está a un departamento en particular. Esta persona podría estar en un departamento o en un ThinkTank.

Parece fácil hacer cosas en SYB siempre que esté haciendo un tipo, pero no estoy seguro de cómo tratar con múltiples tipos de datos.

Respuesta

5

Tendrá que comenzar con un tutorial de SYB,

Las principales funciones de recorrido son:

Juega con ellos para tener una idea de la API, y ya lo resolverás.

SYB generics es un poco más que un ejercicio de Haskell para principiantes.

0

No estoy muy familiarizado con SYB, así que mostraré un ejemplo usando uniplate. El ejemplo solo elimina la unidad de empleado de su departamento o grupo de expertos, pero seguramente encontrará la manera de ampliarla para hacer lo que desee.

> 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

Parece que el tutorial en cs.uu.nl ha desaparecido. Luché por un tiempo con esto, revisando documentos, luego escribí this tutorial. Esperamos que te sea útil.

Cuestiones relacionadas