Language extension proposal

Andrew J Bromage ajb@spamcop.net
Thu, 26 Jun 2003 11:58:12 +1000


G'day all.

On Wed, Jun 25, 2003 at 08:48:12AM -0700, Hal Daume wrote:

> I'm not sure this is really necessary (at least syntax-wise).

Well, of course, no extension is absolutely necessary in a Turing-hard
language. :-)

For the record, here are a couple of other solutions which avoid the
problem.  You could, for example, make the return type a phantom
type:

	newtype T a = T Int

	class Trait a where { trait :: T a }

	instance Trait Int  where { trait = T 0 }
	instance Trait Char where { trait = T 1 }

Or construct the type dictionary explicitly:

	data Traits a
	    = Traits {
		trait1 :: a,
		trait2 :: Int
	      }

	class Trait a where
	    traits :: Traits a

	instance Trait Char where
	    traits = Traits {
			trait1 = 'a',
			trait2 = 16
		     }

Neither solution seems as nice, though, particularly as the traits
typeclass idiom is already entrenched (e.g. Bounded).

> As far as I can tell with the various --ddump-* flags, the compiler
> hasn't yet figured out that the argument to trait is useless (i.e., it
> keeps it in there).

Nor can it, because you could easily declare an instance in another
module for which the argument is _not_ useless.  This is impossible to
detect at compile time.

> Of course, the powers that be can weight in on this, and I'm sure that
> you're aware of the phantom type solution, but I figured I'd post anyway
> so that others can get a look at types like this for their own
> benefit...

Sure.  Any input is good.  I'm not convinced that my proposed solution
is the best one.  (I'm pretty sure that it's the minimal extension
required, though.)

Cheers,
Andrew Bromage