Fundeps and quantified constructors
Marcin 'Qrczak' Kowalczyk
qrczak@knm.org.pl
7 Feb 2001 19:02:20 GMT
Wed, 7 Feb 2001 01:32:38 -0800 (PST), anatoli <anatoli@yahoo.com> pisze:
> > data Foo a = (Eq a) => MkFoo a
What do you mean by this? What is the difference between that and
data Foo a = MkFoo a
except that the latter is more general?
> The same error message is given for
>
> > data Foo a = (Eq b) => MkFoo b
You must write forall explicitly in existentially quantified type
definitions:
data Foo a = forall b. (Eq b) => MkFoo b
> I don't know whether this is intended behaviour; IMHO
> it should be treated identically to
>
> > data Foo a = MkFoo (Eq a => a)
IMHO this should be an error and ghc rejects it. What do you mean
by this?
> Hugs accepts either
>
> > data Eq a => Foo a = MkFoo a
This is almost equivalent to
data Foo a = MkFoo a
except that all uses of Foo must have the appropriate type in Eq.
It does not give any more expressiveness.
> neither syntax works with Collection: the first one would look like
>
> > data forall c. Collection c e => AnyColl e = MkColl c
There can't be forall at such place at all.
> > data AnyColl e = forall c . MkCall (Collection c e => c)
If you mean existential quantification, you should write
data AnyColl e = forall c. Collection c e => MkCall c
and this is accepted by ghc.
> > data AnyColl e = MkCall (forall c . Collection c e => c)
This is accepted by ghc too (but fundeps generally don't work
in versions other than a recent CVS version). This is universal
quantification: you must apply MkCall to a value which has the type
forall c. Collection c e => c
i.e. which is itself polymorphic, and you can choose the type
when using the value extracted from AnyColl. So this is probably not
what you mean.
--
__("< Marcin Kowalczyk * qrczak@knm.org.pl http://qrczak.ids.net.pl/
\__/
^^ SYGNATURA ZASTĘPCZA
QRCZAK