[Haskell-cafe] uniplate (was: code review?)

Neil Mitchell ndmitchell at gmail.com
Mon May 30 21:48:29 CEST 2011

Hi John,

>> > While I'm on the topic, I recently wrote a tool that wanted to
>> > traverse deep data structures as produced by haskell-src-exts. ?I
>> > wound up with about 50 lines of case expressions and around the time
>> > my hands were literally beginning to hurt decided that enough was
>> > enough and I should try a generic approach. ?I heard uniplate was
>> > pretty easy to use, and was pretty pleased to turn the entire thing
>> > into a single line. ?It took me a little longer to figure out I needed
>> > to use universeBi since all the examples were monotyped, but once I
>> > did it Just Worked. ?Amazing. ?So thanks again! ?And maybe you could
>> > mention universeBi in the instant introduction?
>> Yes, I probably should - I'll try and get to that. Of course, I'd also
>> happily accept a patch against
>> http://community.haskell.org/~ndm/darcs/uniplate
>> I use Uniplate inside HLint, and it's invaluable - there are a lot of
>> times when List Comp + universeBi really hits the spot.
> Does Uniplate include an instance for:
>> instance Uniplate a => Biplate [a] a

No, it only includes:

instance Biplate [Char] Char where
    biplate (x:xs) = plate (:) |* x ||* xs
    biplate x = plate x

I am slightly curious why I didn't include the more general a instead
of Char version, but perhaps it doesn't quite work - polymorphic
versions of the Direct instances can have problems if you pick weird
types. I'll have a think, and if it does always work, I'll include it.

Note that if you use the Typeable or Data versions this instance is
automatically available. In practice I almost always end up using the
Data versions of Uniplate, they require no instance definitions are
are good to get started with - you can switch to Direct only if you
need the additional performance.

Thanks, Neil

More information about the Haskell-Cafe mailing list