[Haskell-cafe] Introducing Instances in GHC point releases

Henning Thielemann lemming at henning-thielemann.de
Wed May 27 17:02:55 EDT 2009


On Sun, 24 May 2009, Ketil Malde wrote:

> Duncan Coutts <duncan.coutts at worc.ox.ac.uk> writes:
>
>> The PVP says:
>
>>              1. If any entity was removed, or the types of any entities
>>                 or the definitions of datatypes or classes were changed,
>>                 or instances were added or removed, then the new A.B
>>                 must be greater than the previous A.B.

When I read this point the first time, I was fine with this convention. 
But the more hassle I had with orphan instances I came to the conclusion 
that they are bad enough that they should be treated like unqualified 
anonymous imports. I mean, version policy warrants that I can import a 
module of any package version of type A.B.* when I use exclusively 
qualified imports or explicit unqualified imports. Instances are always 
imported whenever you touch a module, you cannot exclude them. Thus they 
behave like anonymous imports - you cannot control what exactly is 
imported. Version policy does not support anonymous unqualified imports 
because it does not make any warranties if you import this way.

What about orphan instances? If a module misses an instance that belongs 
to one of its types or its classes then it may be added by any other 
module in any other package. If that is done then those orphan instances 
are likely to clash sooner or later. The version policy should warrant 
that within the A.B.* version range I'm safe to import a module the 
qualified or explicitly unqualified way. But since orphan instances can 
get in the way, we don't have this warranty! Say I import packages 
foo-1.2.3 and bar-4.5.6, where foo exports orphan instance C T and bar 
does not import such an instance. I see that it works and think this will 
continue to work as long as I restrict to foo >=1.2.3 && <1.3 and bar >= 
4.5.6 && <4.6. Now, the new version bar-4.5.7 starts to import package 
hmpf-8.9.0, which provides another orphan instance C T. It is allowed to 
depend on new packages in such a version bump, right? Now, my package can 
no longer be compiled, because 'bar' re-exports the orphan instance from 
'hmpf'.

My proposal is thus: Discourage orphan instances! If you encounter that an 
instance is missing and it is a canonical one, it should be added to the 
package that defines the type or the class. If there are several choices 
for the implementation then the package where the instance would belong to 
should document that. Then programmers should find a consensus which of 
the choices they prefer. If you cannot wait for an official adaption of 
the required instance, then you must work with newtype wrappers.

There are cases where you must define an orphan instance. Then this should 
instance should go into a new package by consensus between the maintainer 
of the class and the maintainer of the type.

However, when orphan instances are banned, then it would also be no 
problem to add instances to their home modules within the A.B.* range. So 
I vote for allowing this, too.


More information about the Haskell-Cafe mailing list