On Tue, Jul 28, 2009 at 7:47 AM, Henry Laxen <nadine.and.henry@pobox.com> wrote:
Malcolm Wallace <Malcolm.Wallace <at> cs.york.ac.uk> writes:

>
> > and perhaps use emacs to
> > query-replace all the Foo1's back to Foo's
>
> At least this bit can be avoided easily enough, by using
> module qualification during the conversion process.
>
>      module Original (Foo(..)) where
>      data Foo = Foo { ... y :: Int } deriving ...
>
>      module New (Foo(..)) where
>      data Foo = Foo { ... y, z :: Int } deriving ...
>
>      module Convert where
>      import Original as Old
>      import New as New
>      newFoo :: Old.Foo -> New.Foo
>      newFoo old{..} = New.Foo { a=a, b=b, ... z=1 }
>
> Finally rename module New.
>
> Regards,
>      Malcolm
>

Thanks Malcolm, yes, that keeps me out of emacs, but the part I would really
like to avoid is writing the New.Foo { a=a, b=b, ... z=1 } part, where the field
names are many, long, and varied.  Yes, I could cut and paste, but I'm hoping
for a "better way."  Thanks.

I guess you could define:
type UpgradeFoo = (Foo, Int)

And then write the conversion code as a zip.  upgradeFoo foos = zip foos [1..]

instance Show UpgradeFoo where ...

And then use the module trick to switch the code around?

Jason