> Am 29.05.2016 um 18:07 schrieb Austin Zheng <austinzh...@gmail.com>:
> 
> 
>> On May 29, 2016, at 7:04 AM, Matthew Johnson <matt...@anandabits.com 
>> <mailto:matt...@anandabits.com>> 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.

I agree that adding a bottom type would be a different proposal. As an 
intermediate step we could just make it a type error if an existential would 
only be satisfied by the bottom type. 

-Thorsten


> 
> 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 
>>>>>> <swift-evolution@swift.org <mailto:swift-evolution@swift.org>>:
>>>>>> 
>>>>>> 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 
>>>>>> <swift-evolution@swift.org <mailto:swift-evolution@swift.org>> wrote:
>>>>>> 
>>>>>> 
>>>>>> Sent from my iPad
>>>>>> 
>>>>>> On May 23, 2016, at 9:52 PM, Brent Royal-Gordon via swift-evolution 
>>>>>> <swift-evolution@swift.org <mailto:swift-evolution@swift.org>> 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
>>>>>> > swift-evolution@swift.org <mailto:swift-evolution@swift.org>
>>>>>> > https://lists.swift.org/mailman/listinfo/swift-evolution 
>>>>>> > <https://lists.swift.org/mailman/listinfo/swift-evolution>
>>>>>> 
>>>>>> _______________________________________________
>>>>>> swift-evolution mailing list
>>>>>> swift-evolution@swift.org <mailto:swift-evolution@swift.org>
>>>>>> https://lists.swift.org/mailman/listinfo/swift-evolution 
>>>>>> <https://lists.swift.org/mailman/listinfo/swift-evolution>
>>>>>> 
>>>>>> _______________________________________________
>>>>>> swift-evolution mailing list
>>>>>> swift-evolution@swift.org <mailto:swift-evolution@swift.org>
>>>>>> https://lists.swift.org/mailman/listinfo/swift-evolution 
>>>>>> <https://lists.swift.org/mailman/listinfo/swift-evolution>
>>>>> 
>>>>> _______________________________________________
>>>>> swift-evolution mailing list
>>>>> swift-evolution@swift.org <mailto:swift-evolution@swift.org>
>>>>> https://lists.swift.org/mailman/listinfo/swift-evolution 
>>>>> <https://lists.swift.org/mailman/listinfo/swift-evolution>

_______________________________________________
swift-evolution mailing list
swift-evolution@swift.org
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to