[Hugs-users] Re: Constraint depth cut off

Ross Paterson ross at soi.city.ac.uk
Fri Apr 20 07:18:50 EDT 2007


On Wed, Apr 18, 2007 at 05:10:27PM +0100, Neil Mitchell wrote:
> I have now reduced this bug to a smallish test case:
> 
> test :: T1 -> T1
> test = test2
> 
> test2 :: C3 (T2 a) a => a -> a
> test2 = undefined
> 
> data T1 = C1 deriving Show
> data T2 a = T2 a deriving Show
> 
> class C1 a where
> class C2 a where
> class C3 a b where
> 
> instance C1 T1 where
> instance C1 a => C1 (T2 a) where
> instance (C1 a, C2 a) => C3 T1 a where
> instance (C3 a (T2 a)) => C2 (T2 a) where
> instance (C2 (T2 a)) => C3 (T2 a) b where
> 
> In Hugs I get (overlapping instances and unsafe overlapping instances
> turned on):
> 
> *** The type checker has reached the cutoff limit while trying to
> *** determine whether:
> ***     C1 T1
> *** can be deduced from:
> ***     ()
> 
> The explicit instance for this type makes it surprising that it fails
> to find an instance.

The error message is silly, but there really is a loop here:

	C3 (T2 T1) T1 <= C2 (T2 T1) <= C3 T1 (T2 T1) <= C2 (T2 T1)

> In GHC with -fglasgow-exts -fallow-undecidable-instances, it works fine.

That's because recent GHCs detect the loop when they get to an identical
constraint, and declare the constraint solved.  Simon calls this feature
recursive dictionaries; Martin Sulzmann calls it co-induction.  I can't
find where it's documented in the GHC User's Guide, though.

Hugs does not aim to duplicate that behaviour; the bug here is the error
message.  Here's a simpler illustration of it:

	class C a where
		f :: a -> a

	instance (Eq a, C a) => C a

	test = f True

with -98 says it can't prove Eq Bool, when it should say C Bool.



More information about the Hugs-Users mailing list