
Ian Lynagh
On Mon, Sep 17, 2007 at 07:47:33PM +0100, Jon Fairbairn wrote:
This seems to be a recurrent problem, and I keep wondering whether there might not be a general solution along the lines of declaring that an instance of a class at a particular type subsumes the functions declared with those names at the specialised type.
An interesting idea; I'm not sure, but I think it might help us have code in the logical place in the base library without import loops.
The only ugliness I see is that if I have
module I where x :: Int x = 5
module B where x :: Bool x = True
module C where import I import B
class C a where x :: a
instance C Int where x subsumes I.x
instance C Bool where x subsumes B.x
then importing I and B but not C could lead to confusion and ambiguity.
I don't see how, or at least, I don't see how my suggestion would make the situation worse -- if you import I and B, you'd get the same problem as you currently do in the absence of this subsumption mechanism. Indeed, importing C with its subsuming instances is a solution to this particular problem. A slightly knottier case is if module D where x :: Int x = 4 and someone attempts to import A, D and C -- but I think it would be straightforeardly rejected, requiring x to be hidden (or imported qualified) from D. -- Jón Fairbairn Jon.Fairbairn@cl.cam.ac.uk