
On Sun, Jun 16, 2019 at 09:59:27AM +1000, Jack Kelly wrote:
Tom Ellis
writes: 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.
Unfortunately I don't think this scheme allows the user to write code that is compatible with version 1 and version 2 at the same time.