# Uniplate

### From HaskellWiki

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.

## Contents |

## 1 Links

- Project home page: http://www-users.cs.york.ac.uk/~ndm/uniplate/
- Hackage release: http://hackage.haskell.org/cgi-bin/hackage-scripts/package/uniplate
- 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://ndmitchell.com/downloads/paper-uniform_boilerplate_and_list_processing-30_sep_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 Example

Given andata 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.

## 4 Trailer

The Uniplate library has been used in Yhc, Catch, Hoogle and other projects. Please direct any follow-up discussion to haskell-cafe.

Thanks Neil