Friends
One of GHC's more widely-used features is overlapping (and sometimes 
incoherent) instances.  The user-manual documentation is 
here<http://www.haskell.org/ghc/docs/latest/html/users_guide/type-class-extensions.html#instance-overlap>.
The use of overlapping/incoherent instances is controlled by LANGUAGE pragmas: 
OverlappingInstances and IncoherentInstances respectively.
However the overlap/incoherent-ness is a property of the *instance declaration* 
itself, and has been for a long time.  Using LANGUAGE OverlappingInstances 
simply sets the "I am an overlapping instance" flag for every instance 
declaration in that module.
This is a Big Hammer.  It give no clue about *which* particular instances the 
programmer is expecting to be overlapped, nor which are doing the overlapping.  
  It brutally applies to every instance in the module.  Moreover, when looking 
at an instance declaration, there is no nearby clue that it might be 
overlapped.  The clue might be in the command line that compiles that module!
Iavor has recently implemented per-instance-declaration pragmas, so you can say

instance {-# OVERLAPPABLE #-} Show a => Show [a] where ...

instance {-# OVERLAPPING #-} Show [Char] where ...
This is much more precise (it affects only those specific instances) and it is 
much clearer (you see it when you see the instance declaration).
This new feature will be in GHC 7.10 and I'm sure you will be happy about that. 
 But I propose also to deprecate the LANGUAGE pragmas OverlappingInstances and 
IncoherentInstances, as way to encourage everyone to use the new feature 
instead of the old big hammer.  The old LANGUAGE pragmas will continue to work, 
of course, for at least another complete release cycle.  We could make that two 
cycles if it was helpful.
However, if you want deprecation-free libraries, it will entail a wave of 
library updates.
This email is just to warn you, and to let you yell if you think this is a bad 
idea.   It would actually not be difficult to retain the old LANGUAGE pragmas 
indefinitely - it just seems wrong not to actively push authors in the right 
direction.
These deprecations of course popped up in the test suite, so I've been 
replacing them with per-instance pragmas there too.  Interestingly in some 
cases, when looking for which instances needed the pragmas, I found...none. So 
OverlappingInstances was entirely unnecessary.  Maybe library authors will find 
that too!
Simon
_______________________________________________
ghc-devs mailing list
ghc-devs@haskell.org
http://www.haskell.org/mailman/listinfo/ghc-devs

Reply via email to