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

2011-05-30 Thread Neil Mitchell
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

___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe


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

2011-05-30 Thread John Lato
Hi Neil, thanks for the response.

On Mon, May 30, 2011 at 8:48 PM, Neil Mitchell ndmitch...@gmail.com wrote:

 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.


I started with Data, but writing the Direct instance was so simple that I
didn't see a reason not to do it.  My type doesn't have many constructors
yet though, and several of them aren't recursive, so maybe it was easier
than normal.

John
___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe


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

2011-05-25 Thread John Lato

 From: Neil Mitchell ndmitch...@gmail.com

  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
?

Since lists are a common case, I was surprised that this instance wasn't
included.  Is there a reason it shouldn't exist?  I was importing
Data.Generics.Uniplate.Direct FWIW.

Thanks,
John Lato
___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe