[swift-evolution] [Manifesto] Completing Generics

Howard Lovatt howard.lovatt at gmail.com
Wed Mar 9 22:35:37 CST 2016

I am sure you know the answer for Swift; but in other languages it doesn't,
e.g. Java.

With Java semantics:

func foo<Input, Output>(input: Input) -> Output

Would be the same as:

func foo(input: Any) -> Any

Because the only constraint on both Input and Output is Any. Since the Java
compiler erases generics, the two would literally be the same to the JVM!

Since Swift doesn't allow overloading on return type and therefore as it
stands `func foo<Input, Output>(input: Input) -> Output` cannot
be implemented, it would be nice if the compiler flagged this as an error
and suggested that you meant `func foo(input: Any) -> Any`.

  -- Howard.

On 10 March 2016 at 13:07, Joe Groff <jgroff at apple.com> wrote:

> > On Mar 9, 2016, at 6:02 PM, Howard Lovatt <howard.lovatt at gmail.com>
> wrote:
> >
> > Wow, I would never have guessed that syntax :)
> >
> > It makes no sense to me to interpret a generic constraint as meaning all
> instead of any. How could anything either accept or return all possible
> implementations of something simultaneously, surely it only ever accepts or
> returns one of all the possible implementations at a time.
> A type variable in angle brackets always means "all". It's like a function
> parameter, but at type level—it's in the caller's hands what it gets bound
> to. You couldn't write a function `func foo<Input, Output>(Input) ->
> Output` unless that function was able to generate a value of every possible
> type a caller might pass in for Output, just like you couldn't write e.g.
> 'absolute value' as taking its result as a second parameter.
> >
> > If the interpretation for output is that at time 1 it returns one of all
> the possible implementations at at time 2  returns another - then that is
> what I want. However I would describe that as returning one of the possible
> implementations, not all.
> >
> > But no doubt you are correct, since you probably wrote that bit of the
> compiler :(
> >
> > More practical points
> >
> >  1. My compiler, 7.3 beta (7D152p), rejects the syntax, it doesn't like
> where inside Any<> saying it expects > to complete generic argument list.
> When will this be available, so that I can try it out?
> >  2. Will the declarations inside protocols also change to the Any<...>
> form or will all the generics remain following the function name rather in
> a returned Any<...>? Currently -> Any<...> doesn't work in protocols for me.
> >  3. In the construct Any<Protocol where Type == Type>, i.e. same type
> name used in protocol and enclosing struct/class/extension, does the left
> Type refer to the protocol or the enclosing struct/class/extension?
> >  4. Is there any documentation of all of this?
> Sorry, this is all possible future syntax and features. It's not
> implemented today. You'd need to write your own equivalent of the "Any"
> wrapper by hand right now.
> -Joe
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-evolution/attachments/20160310/57c7911b/attachment.html>

More information about the swift-evolution mailing list