Interesting ideas! One way to make explicit re-export pragmas less necessary would be to ignore package-local re-exports. This might seem funky initially, there's precedent for involving packages with import semantics (package-qualified imports), and this is a sensible granularity for such judgments because it's reasonable to assume "global" knowledge of instances inside a package. To minimize need for explicit pragmas, we could have another variety of module export that specifies which imports provide instances that should be explicitly re-exported. While the explicit pragma might still be desirable (seems fiddly, though..), I think that this would cover a great deal of the problems. The syntax might look like: module Foo(..., module instances Bar) where import Bar Could also think about "filtering" based on partial specifications - "Only re-export Monad instances", "Only re-export things involving Maybe", "Hide everything involving Maybe", etc etc. This gets a bit more complicated: module Foo(..., module instances Bar(Monad, Maybe)) where import Foo I'm not at all sold on this more complicated one, but something along this line might be good. -mgsloan On Thu, Sep 6, 2012 at 2:10 AM, Henning Thielemann <schlepptop@henning-thielemann.de> wrote:
Am 06.09.2012 02:43, schrieb Michael Sloan:
I agree that it's quite unfortunate that adding instances causes a major bump. I think that instead it would make sense to only bump your major version whenever you add *orphan* instances. This is because it is known to be dangerous to create orphan instances, and the errors are relatively transparent. While I suppose it could break proper dependency resolution, a big reason for upper bounds is preventing a cascade of confusing errors. With orphan instances the errors are very finite.
In general here are a few different things that would help with the orphans problem:
There have been some ideas about explicit import of instances.
I also had some thoughts about how GHC can help managing orphan instances when they are necessary: http://www.haskell.org/pipermail/haskell-cafe/2011-July/094014.html