Nicholls, Mark wrote:
Thanks for your response, I think you helped me on one of my previous
abberations.

Hmmm....this all slightly does my head in....on one hand we have
types....then type classes (which appear to be a relation defined on
types)....then existential types...which now appear not to be treated
quite in the same way as 'normal' types....and in this instance the
syntax even seems to change....does
"instance Num a => A a"

This means:

Given any type "a". Any type at all. Yes, ANY type "a", we accept that it might be an instance of A, and we add a "Num" context to the current inference.

So, supposing:  f :: (A a) => a -> b

and we're trying to type check:

f x

We first try to unify x's type with the type variable "a", which is easy. Then we impose the constraint "A a". At some later stage we will try to resolve this constraint. When we try to resolve it, we find that all types "a" are instances of A, but you have to add a Num constraint. So we add the Num constraint.

This behaviour is not what everyone wants, but it is a consequence of they type classes are specified.

GHC lets you turn off this behaviour somewhat with overlapping and undecidable instances but that's not really an ideal solution either.

The ideal solution to this precise case is probably just to make the Num class a superclass of A. That seems to do what you want.

Jules
_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to