
Tom Ellis
I am unsure how to change the name of a class in a library whilst providing a safe deprecation cycle for the users of the library. Suppose I have version 1 of my library with a class
-- Version 1 class Foo a where foo :: a
and I want to migrate it to version 3 as follows, but with a deprecation cycle provided by version 2 that allows code to work with either version 1 and 2, or 2 and 3.
-- Version 3 class Bar a where bar :: a
What if you inserted Bar as a superclass of Foo in V2? -- Version 1 class Foo a where foo :: a -- Version 2 {-# DEPRECATED Foo "it's going away in V3" #-} class Bar a => Foo a where foo :: a class Bar a where bar :: a -- Version 3 class Bar a where bar :: a Users of version 1 can use Foo/foo/... When they upgrade to version 2, they get forced to write a Bar instance, get warned that Foo is going away, and they can use the class Bar to implement their own instances. Users of version 3 can only use Bar/bar/... Does that help? -- Jack