
I believe that ghc translates the signature above to
foo :: forall q . Foo q => Double -> q
(I don't understand why GHC does this... it seems to have more potential for confusion)
I thought post 5.03 didn't do this? Isn't this the point of "Putting type annotations to use"? Or am I missing something?
This should more clearly show that foo is required to take a Double and give, in return, anything in class Foo that is requested, which it certainly does not (it always returns a Double).
Right.
class Foo p where instance Foo Double where data T = forall q . Foo q => T q foo :: Double -> T foo p = T p
which is very similar, except that the explicit universal quantification is happening in in the datatype and not the function type.
Actually, this is not really universal quantification, it is existential quantification. If you actually wrote a datatype that did universal
I meant existential. Sorry