> On May 29, 2016, at 7:04 AM, Matthew Johnson <[email protected]> wrote:
> 
> 
> This makes a lot more sense!  So you want to be able to use uninhabitable 
> types in the contexts of things like collection elements (such collections 
> must always be empty but are inhabitable by a single empty instance).  It is 
> a great example of why it might make sense to allow types like this.  
> 
> What you are really asking for is the ability to drop the restriction that 
> only a single superclass constraint is allowed and no value type constraints 
> are allowed.  It might be useful in cases like your intersection example.  
> But it could also be a source of error confusing error messages when people 
> form such a type and it doesn't work the way they expect.  If the type is 
> disallowed as under the current proposal the error message might be more 
> straightforward.  This is a topic that probably deserves further 
> consideration.  But I have to say I find your intersection example to be 
> reasonably compelling.
> 
> Austin, what do you think about this example?

I personally don't feel like the additional complexity is worth it as Swift 
exists today.

Swift getting a real bottom type would be a completely different proposal. It 
would allow you to do things like:

let universalNil : Bottom? = nil
var a : Int? = universalNil
var b : UIView? = universalNil

and so on.

If Swift does ever get such a type relaxing the restriction from the proposal 
would be an additive change, and could be proposed separately as a follow up 
addition.

Austin


> 
>> 
>> -Thorsten
>> 
>> 
>>> 
>>> To write this `union` and have it behave in the usual way you need `Any<A, 
>>> B>` to be a supertype of `A` and of `B`.  The existential doesn’t actually 
>>> do that so it would not be possible for this union function to guarantee 
>>> the result would have all of the members of `x` and all the members of `y` 
>>> the way that a `union` usually would.  
>>> 
>>> The anonymous union type `A | B` *is* a supertype of `A` and a supertype of 
>>> `B` so you would have no trouble writing this:
>>> 
>>> func union<A, B>(x: Set<A>, y: Set<B>) -> Set<A | B> { … }
>>> 
>>> And returning the expected result.
>>> 
>>>> 
>>>> 
>>>> -Thorsten
>>>> 
>>>> 
>>>> 
>>>>> Am 26.05.2016 um 07:53 schrieb Austin Zheng via swift-evolution 
>>>>> <[email protected] <mailto:[email protected]>>:
>>>>> 
>>>>> The inimitable Joe Groff provided me with an outline as to how the design 
>>>>> could be improved. I've taken the liberty of rewriting parts of the 
>>>>> proposal to account for his advice.
>>>>> 
>>>>> It turns out the runtime type system is considerably more powerful than I 
>>>>> expected. The previous concept in which protocols with associated types' 
>>>>> APIs were vended out selectively and using existentials has been 
>>>>> discarded.
>>>>> 
>>>>> Instead, all the associated types that belong to an existential are 
>>>>> accessible as 'anonymous' types within the scope of the existential. 
>>>>> These anonymous types are not existentials - they are an anonymous 
>>>>> representation of whatever concrete type is satisfying the existential's 
>>>>> value's underlying type's associated type.
>>>>> 
>>>>> This is an enormous step up in power - for example, an existential can 
>>>>> return a value of one of these anonymous associated types from one 
>>>>> function and pass it into another function that takes the same type, 
>>>>> maintaining perfect type safety but without ever revealing the actual 
>>>>> type. There is no need anymore to limit the APIs exposed to the user, 
>>>>> although there may still exist APIs that are semantically useless without 
>>>>> additional type information.
>>>>> 
>>>>> A set of conversions has also been defined. At compile-time 'as' can be 
>>>>> used to turn values of these anonymous associated types back into 
>>>>> existentials based on the constraints defined earlier. 'as?' can also be 
>>>>> used for conditional casting of these anonymously-typed values into 
>>>>> potential actual types.
>>>>> 
>>>>> As always, the link is here, and feedback would be greatly appreciated: 
>>>>> https://github.com/austinzheng/swift-evolution/blob/az-existentials/proposals/XXXX-enhanced-existentials.md
>>>>>  
>>>>> <https://github.com/austinzheng/swift-evolution/blob/az-existentials/proposals/XXXX-enhanced-existentials.md>
>>>>> 
>>>>> Best,
>>>>> Austin
>>>>> 
>>>>> On Tue, May 24, 2016 at 5:09 AM, Matthew Johnson via swift-evolution 
>>>>> <[email protected] <mailto:[email protected]>> wrote:
>>>>> 
>>>>> 
>>>>> Sent from my iPad
>>>>> 
>>>>> On May 23, 2016, at 9:52 PM, Brent Royal-Gordon via swift-evolution 
>>>>> <[email protected] <mailto:[email protected]>> wrote:
>>>>> 
>>>>> >> One initial bit of feedback -  I believe if you have existential 
>>>>> >> types, I believe you can define Sequence Element directly, rather than 
>>>>> >> with a type alias. e.g.
>>>>> >>
>>>>> >> protocol Sequence {
>>>>> >>  associatedtype Element
>>>>> >>  associatedtype Iterator: any<IteratorProtocol where 
>>>>> >> IteratorProtocol.Element==Element>
>>>>> >>  associatedtype SubSequence: any<Sequence where Sequence.Element == 
>>>>> >> Element>
>>>>> >>  …
>>>>> >> }
>>>>> >
>>>>> > That's not really the same thing. Any<IteratorProtocol> is an 
>>>>> > existential, not a protocol. It's basically an automatically-generated 
>>>>> > version of our current `AnyIterator<T>` type (though with some 
>>>>> > additional flexibility). It can't appear on the right side of a `:`, 
>>>>> > any more than AnyIterator could.
>>>>> 
>>>>> After this proposal you should be able to use these existentials anywhere 
>>>>> you can place a constraint, so it would work.  You can do this with the 
>>>>> protocol composition operator today and the future existential is just an 
>>>>> extension of that capability.
>>>>> 
>>>>> >
>>>>> > What *would* work is allowing `where` clauses on associated types:
>>>>> >
>>>>> >> protocol Sequence {
>>>>> >>  associatedtype Element
>>>>> >>  associatedtype Iterator: IteratorProtocol where 
>>>>> >> Iterator.Element==Element
>>>>> >>  associatedtype SubSequence: Sequence where SubSequence.Element == 
>>>>> >> Element
>>>>> >>  …
>>>>> >> }
>>>>> >
>>>>> > I believe this is part of the generics manifesto.
>>>>> >
>>>>> > --
>>>>> > Brent Royal-Gordon
>>>>> > Architechies
>>>>> >
>>>>> > _______________________________________________
>>>>> > swift-evolution mailing list
>>>>> > [email protected] <mailto:[email protected]>
>>>>> > https://lists.swift.org/mailman/listinfo/swift-evolution 
>>>>> > <https://lists.swift.org/mailman/listinfo/swift-evolution>
>>>>> 
>>>>> _______________________________________________
>>>>> swift-evolution mailing list
>>>>> [email protected] <mailto:[email protected]>
>>>>> https://lists.swift.org/mailman/listinfo/swift-evolution 
>>>>> <https://lists.swift.org/mailman/listinfo/swift-evolution>
>>>>> 
>>>>> _______________________________________________
>>>>> swift-evolution mailing list
>>>>> [email protected] <mailto:[email protected]>
>>>>> https://lists.swift.org/mailman/listinfo/swift-evolution 
>>>>> <https://lists.swift.org/mailman/listinfo/swift-evolution>
>>>> 
>>>> _______________________________________________
>>>> swift-evolution mailing list
>>>> [email protected] <mailto:[email protected]>
>>>> https://lists.swift.org/mailman/listinfo/swift-evolution 
>>>> <https://lists.swift.org/mailman/listinfo/swift-evolution>
_______________________________________________
swift-evolution mailing list
[email protected]
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to