
On 2003-04-17 at 09:02BST "Simon Peyton-Jones" wrote:
Many of you have grown to love existential data types, which we current write like this:
data T = forall a. Foo a (a -> Int)
Mark and I chose 'forall' rather than 'exists' to save grabbing another keyword from the programmer. And indeed, the type of the constructor Foo is Foo :: forall a. a -> (a->Int) -> T
But every single time I explain this to someone, I find I have to make excuses for using the term 'forall'. I say "it really means 'exists', but we didn't want to lose another keyword".
I have gradually concluded that our decision was a mistake.
I strongly agree. Suppose at some point we wanted to allow something like data T = exists t. Foo t (t -> Int) (forall x . x -> x) the present notation would be /really/ confusing, especially since any real example would be more complex than the above.
Allow 'exists'
Yes.
Deprecate 'forall' (for defining existentials, that is) Eventually allow only 'exists'
Is there really a need for an overlap? If, at the next release you were to emit a special error message, rather than a "deprecated" warning, wouldn't that prompt people to make the change more swiftly? I suppose this would only be acceptable if an automatic translation were provided. Jón -- Jón Fairbairn Jon.Fairbairn@cl.cam.ac.uk