So far, all the discussions for the syntax were revolving around the protocol. I'd like to put on the table another idea - what if instead we try to make the syntax starting from the type of the value boxed by the existential.
Any
could be spelled as any<T> T
P
could be spelled as any<T> T where T: P
P & Q
could be spelled as any<T> T where T: P, T: Q
any Array
could be spelled as any<T> Array<T>
In the most general case, this gives feature parity between existentials and generics:
any<T, U> Array<T> where T: Collection, T.Element == Optional<U>