xiongyf04: > I am writing a compiler using Haskell. After the compiler parses program, the > program is stored into an syntax tree stucture defined blew: > > ...... > data Exp > = Plus Exp Term > | Minus Exp Term > | Term Term > deriving Show > > data Term > = Times Term Factor > | Div Term Factor > | Factor Factor > deriving Show > ...... > > This is just part of the definition. The full tree contains much more > definition than this. Now I want to adjust the syntax-tree. However, I don't > need to adjust all the data types, but a small subset of the syntax tree. > e.g. I might adjust the "Times" data like the following, but not modify the > rest of the syntax tree: > transformTerm (Times t f) = Times t (FactorInt 100) > > However, in order to apply the modification like this, I have to write a > series of function to traverse the tree until I get to the Term data type. > e.g. I have to define: > transformExp (Plus e t) = Plus (transformExp e) (transformTerm t) > transformExp (Minus e t) = Minus (transformExp e)(transformTerm t) > transformTerm (Term t) = ... > > This is tedious and error-prone. I want to know if there some means in > Haskell to write a single "generic" function to traverse the syntax tree and > only stop on the "Term" data type. Can anyone tell me something about it? > Thanks a lot. >
The "Scrap Your Boilerplate" series covers this, as does several other works on generics in Haskell. Here's a good place to start: http://www.cs.vu.nl/boilerplate/ also, http://www.informatik.uni-bonn.de/~loeh/SYB0.html http://www.informatik.uni-bonn.de/~loeh/SYB1.html -- Don _______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe