
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