Specifying dependencies on Haskell code

Roman Leshchinskiy rl at cse.unsw.edu.au
Fri May 9 00:33:09 EDT 2008


Duncan Coutts wrote:
> 
> In the initial discussions on a common architecture for building
> applications and libraries one of the goals was to reduce or eliminate
> untracked dependencies. The aim being that you could reliably deploy a
> package from one machine to another.

Sorry for jumping in so late but here are my two cents anyway.

IMO, a package is absolutely the wrong thing to depend on. Essentially, 
a package is an implementation of an interface and depending on 
implementations is a bad thing. Code should only depend on interfaces 
which are completely independent entities. I suspect that a lot of the 
problems with packages occur because the current system doesn't follow 
this simple principle.

It would be nice if Cabal had an explicit concept of interfaces, with
the idea that code depends on them and packages implement them. In the 
simplest case, an interface is just a name. Ideally, it would be a 
combination of type signatures, Quickcheck properties, proof obligations 
etc. The important thing is that it has an explicit definition which is 
completely independent of any concrete implementation and which never 
changes.

Something like this would immediately solve a lot of problems. Several 
packages could implement the same interface and we could pick which one 
we want when building stuff. We could have much more fine-grained 
dependencies (if all I need is an AVL tree, I don't want to depend on 
the entire containers package, but rather just on the AVL part of it). 
One package could implement several versions of an interface to ensure 
compatibility with old code (I could imagine module names like 
AVL_1.Data.AVLTree, AVL_2.Data.AVLTree etc., where AVL_1 and AVL_2 are 
interface names; Cabal could then map the right module to Data.AVLTree 
when building). If interface definitions include something like 
Quickcheck properties, we would have at least some assurance that a 
package actually does implement its interfaces. Moreover, this would 
also make the properties themselves reusable.

Note that I don't propose that we automatically extract interfaces from 
code. In fact, I think that would be precisely the wrong way to go. An 
interface is not a by-product of implementing a package. It should be 
defined explicitly.

In general, I don't think that existing package management systems do a 
very good job of specifying dependencies. They sort of work for 
distributing software but do they really work for versioning libraries? 
In any case, we ought to have something better for Haskell where we 
(hopefully) have somewhat different standards when it comes to 
correctness and ease of use. It might be more worthwhile to look at 
systems such as Corba, Microsoft's OLE or whatever that's called 
nowadays, Java's equivalent, whatever that is and, of course, ML's 
modules. None of these is quite right for what we want but IMO they are 
much closer to our problem domain than something like RPM.

Roman





More information about the Libraries mailing list