Show, Eq not necessary for Num [Was: Revamping the numeric c

Marcin 'Qrczak' Kowalczyk
9 Feb 2001 19:31:08 GMT

Fri, 9 Feb 2001 11:48:33 -0500, Dylan Thurston <> pisze:

> > > class (Show a, Read a, Eq a) => Comfortable a
> > > instance (Show a, Read a, Eq a) => Comfortable a 

> Why isn't it legal?

Because in Haskell 98 instance's head must be of the form of a type
constructor applied to type variables. Here it's a type variable.

> I just tried it, and Hugs accepted it, with or without extensions.

My Hugs does not accept it without extensions.

ghc does not accept it by default. ghc -fglasgow-exts accepts an
instance's head which is a type constructor applied to some other
types than just type variables (e.g. instance Foo [Char]), and
-fallow-undecidable-instances lets it accept the above too.

I forgot that it can make context reduction infinite unless the
compiler does extra checking to prevent this. I guess that making it
legal keeps the type system decidable, only compilers would have to
introduce some extra checks.

Try the following module:

module Test where

class Foo a where foo :: a
class Bar a where bar :: a
class Baz a where baz :: a

instance Foo a => Bar a where bar = foo
instance Bar a => Baz a where baz = bar
instance Baz a => Foo a where foo = baz

f = foo

Both hugs -98 and ghc -fglasgow-exts -fallow-undecidable-instances
reach their limits of context reduction steps.

 __("<  Marcin Kowalczyk *
  ^^                      SYGNATURA ZASTĘPCZA