OK I have tested with today's GHC 7.6.2, which is very slightly later than the 
release candidate.

When I add (EuclideanRing (UPol k)) to the signature for cubicExt, the whole of 
demotest compiles.  So that works.


Your misconception is here:

| c) Pol3_  has
|    instance (LinSolvRing (Pol a), CommutativeRing a) =>
|                                               LinSolvRing (UPol (Pol a))
|    But this does not overlap with   Field k => LinSolvRing (UPol k).
| 
|    Because  Pol a  is never of a  Field  nor of  EuclideanRing.

When matching instances, GHC does not take account of the context of the 
instance. Say you have

        data T a = ...
        data S1 = ...
        data S2 = ...
[a]     instance Num a  => Num (T a) where ...
[b]     instance Show a => Num (T a) where ...
        instance Num S1

and suppose you need an instance of (Num (T S1)). Then although [a] and [b] 
overlap, you might say we should use [a], since S1 is an instance of Num, but 
not an instance of Show.  But GHC does not do this.  It matches instances only 
based on the bit after the "=>". 

I'm sorry, but that's the way it is.  (There are good reasons for this.)


If you don't care which of the overlapping instances is picked, then you can 
use -XIncoherentInstances.  But you have to set that flag at the *instance 
declaration* not at the *use* of the instance.  In this case it would be the 
instance for LinSolvRing (UPol k)

Simon

_______________________________________________
Glasgow-haskell-users mailing list
Glasgow-haskell-users@haskell.org
http://www.haskell.org/mailman/listinfo/glasgow-haskell-users

Reply via email to