I am pleased to announce Uniplate (formerly known as Play), a library for boilerplate removal requiring only Haskell 98 (for normal use) and optionally multi-parameter type classes (for more advanced features). This library has been tested with Yhc, Hugs and GHC.
The Uniplate library can do some of the same things as [[Scrap Your Boilerplate]] (SYB), and has functions that can be used in a similar manner to everywhere and everything.
- Project home page: http://www-users.cs.york.ac.uk/~ndm/uniplate/
- Hackage release: http://hackage.haskell.org/cgi-bin/hackage-scripts/package/uniplate-1.0
- Haddock docs: http://www.cs.york.ac.uk/fp/haddock/uniplate/
- Short Manual: http://www.cs.york.ac.uk/fp/darcs/uniplate/uniplate.htm
- Draft Paper: http://www-users.cs.york.ac.uk/~ndm/downloads/draft-uniplate-15_jun_2007.pdf
The manual contains a basic overview of some bits of the library, the paper goes into more detail, but is intended to still be a readable introduction to the library.
2 ExampleGiven an
data Expr = Add Expr Expr | Val Int | Sub Expr Expr | Var String | Mul Expr Expr | Neg Expr | Div Expr Expr
We can extract all the variables using the function:
variables :: Expr -> [String] variables (Var x ) = [x] variables (Val x ) =  variables (Neg x ) = variables x variables (Add x y) = variables x ++ variables y variables (Sub x y) = variables x ++ variables y variables (Mul x y) = variables x ++ variables y variables (Div x y) = variables x ++ variables y
Or we can use the Uniplate library:
variables :: Expr -> [String] variables x = [y | Var y <- universe x]
3 Thanks to
Colin Runciman, Bjorn Bringert, Jules Bean, Eric Mertens, Tom Shackell and Stefan O'Rear for various help and feedback.