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 _______________________________________________ Haskell mailing list [EMAIL PROTECTED] http://www.haskell.org/mailman/listinfo/haskell