[Hs-Generics] Re: Add everywhereM' to Data.Generics.Schemes

Matthias Reisner matthias.reisner at googlemail.com
Sun Apr 18 17:04:48 EDT 2010

Hi Neil,

for a library I use a version of everywhereM', similar to Maciej's one, 
too. I need to traverse an AST in top-down manner and replace some terms 
by others, like in the following simplified example:

    B (A (B x)) -> f x
    A (B x)     -> g x
    B x         -> h x
    x           -> x

Here a bottom-up traversal would produce wrong results. (The functions 
f, g, h don't make use of A and B, so I didn't think about if 
everywhereM' would completely fail if they would.)

This said, if I understand your last post correctly, the use of 
everywhereM' would be a bug here in your eyes. Do you agree? Because I 
don't think so. I haven't done a lot of testing yet, but each case where 
a replacement has to be performed works as expected. And even if it's 
not a bug, do you suggest to drop everywhereM' and use uniplate instead, 
just to play it safe?



Am 18.04.2010 09:38 schrieb Neil Mitchell:
> Hi,
> I thought a lot about everywhere' when writing uniplate. I have an
> equivalent of everywhere (transform), but no transform'. In the end I
> decided that it was virtually impossible to use everywhere' correctly,
> and that almost every call of everywhere' was either somewhere an
> everywhere would have worked equally well, or a bug. I then went
> through all the Haskell source code I could find, found about 6 calls
> to everywhere', and all of them would have performed the same job as
> everywhere.
> So, my suggestion is that everywhereM' probably isn't very useful, but
> descend/descendM (or compos) is a useful top-down traversal scheme.
> Thanks, Neil

More information about the Libraries mailing list