foralls in class assertions
Ashley Yakeley
ashley@semantic.org
Tue, 19 Feb 2002 17:07:47 -0800
At 2002-02-19 09:21, Simon Peyton-Jones wrote:
>I don't know if it makes sense. You've written down some syntax,
>but it's not clear to me what you intend by it.
Hmm... it should be straightforward...
> instance (forall a. Eq a => Eq (f a)) => Eq (Rose f a) where..
I assume that the 'a' quantified in (forall a. ...) is not the same as
the 'a' in 'Rose f a'?
>| instance
>| (
>| forall a. HasIdentity (m a a),
>| forall a b c. Composable (m b c) (m a b) (m a c)
>| ) =>
>| Category m;
This means 'if for all a, "HasIdentity (m a a)", and also for all a b c,
"Composable (m b c) (m a b) (m a c)", then "Category m"'.
"(forall a. HasIdentity (m a a))" as a class assertion declares a
property of m. It says that for all types a, there's an instance
"HasIdentity (m a a)".
>| Or even allow the foralls their own context:
>|
>| foo :: (forall a. (C a b) => D a c) => T b c;
This means foo has type (T b c), where for every type a for which there's
an instance "C a b", there's an instance "D a c".
>| class
>| (
>| forall a. HasIdentity (m a a),
>| forall a b c. Composable (m b c) (m a b) (m a c)
>| ) =>
>| Category m;
Personally I think the 'superclass' arrow in class declarations should
point the other way, as in '<='. After all, instances of the class imply
instances of the superclasses, not the other way around.
But that aside, this means '"Category" is a class on m, provided that for
all types a, there's an instance "HasIdentity (m a a)", and also for all
types a b c, there's an instance "Composable (m b c) (m a b) (m a c)"'.
--
Ashley Yakeley, Seattle WA