planning for ghc-6.10.1 and hackage [or: combining packages to yield new type correct programs]

Don Stewart dons at galois.com
Thu Oct 2 03:58:09 EDT 2008


duncan.coutts:
> Hi,
> 
> We're getting pretty close to a final ghc-6.10.1 release. We would like
> of course for the transition this time to be less painful than last
> time. We all got a lot of flack last time for having no plan in place
> and making everyone change all their .cabal files etc.
> 
> This time we can do a lot better. We have already decided to ship two
> versions of base, version 3 and version 4. Version 4 is the even more
> stripped down one, and with changes to exception handling etc. The
> version 3.1 of base depends on base 4 and re-exports most of it with a
> few differences so that it provides essentially the same api as base 3.0
> did (which was included in ghc-6.8.x).
> 
> However we are not all the way there yet. If we released ghc-6.10.1
> today everything would still break. By everything I mean everyone's
> private projects and all the packages on hackage. The only packages that
> would build would be trivial ones, or the ones that come with ghc.

Here are my notes on why this is so hard, and so scary, and what we can do.

So Duncan and I spent about 6 hours tonight working out how to make the 
cabal-install constraint solver, and the Cabal configure invariants,
work when programs attempt to use base-3 and base-4 on the same system.

Here's a summary of why this is non-trivial,

* We're trying to compose packages on the users machine to yield new
  type correct programs.

* We're using cabal dependencies to decide when it is safe to do this.
  Hopefully we don't rule in any type incorrect combinations, nor rule
  out to many type correct combinations.

* This is scary - in fact, we think the package system admits type
  incorrect programs (based on Typeable, or initialised global state), 
  as it is similar to the runtime linking problem for modules.

* We use constraint solving determine when composition is safe, by looking at 
        "package >= 3 && < 4"
  style constraints. That is, we try to guess when the composition
  would yield a type correct program.

* Again, we're using constraint solving on this language to
  determine when composition of Haskell module sets (aka packages) would
  yield type correct Haskell programs
  
  All without attempting to do type checking of the interfaces between
  packages -- the very thing that says whether this is sound!

* This previously relied on a strong invariant:

    + There was only to be one package-version assignment in a program
    + People didn't change APIs too much, and tried to follow the
      versioning spec, and wrote .cabal deps that followed the spec.

* But now we allow multiple package-version assignments, as long as one
  depends on the other, and doesn't redefine types.

(You'll notice by now we're in deep scary-land, trying, after compile
time, to compose type correct modules into sets of modules (packages),
and then composing those sets with each other to yield type correct
programs, some of which redefine parts of the module hierarchy, and
doing all this without implementing a type checking story for when to
combine these sets safely).

* So, the solver for cabal-install has to be updated to allow the same 
  package to have multiple, conflicting versions, as long as version X
  depends on version Y, and then not reject programs that produce this
  constraint.

* This is non trivial, but think this refactoring is possible, but it is
  hard. ultimately we're still making optimistic assumptions about 
  when module sets can be combined to produce type correct programs, 
  and conservative assumptions, at the same time.

  What we need is a semantics for packages, that in turn uses a
  semantics for modules, that explains interfaces in terms of types.

  Packages of functors, containing modules, which we can truly compose
  to yield type correct programs.

* But we think the cabal-install solver will be refactorable to let a
  good number of programs work, but it'll take a few days of constraint solver hacking.

* The end result is that cabal-install should be able to find automated
  install plans for packages that ask for base-3, even when base-4 is on
  the system as well, and it uses pieces of base-3 libraries and base-4
  libraries. Some more programs will work than if we didn't ship base-3.

* The two other ways of combining packages into Haskell programs,

    + ghc --make 
    + runhaskell Setup.hs configure
 
  will always pick base-4 now, so you won't be able to build programs
  against the base-3 without manually overriding. This means things that
  need the old exception API, for example, or syb, will break without
  manual hiding (--package base-3.0.0.0).

* We're missing hard stats on what number of things break under which
  scheme.

-- Don


More information about the Glasgow-haskell-users mailing list