I understand that name clashing in those instances is important to discuss, but 
I still think it is slightly orthogonal to the proposal. Let me try to explain 
why.

If typealises in protocols are to have the same semantics as alises outside 
protocols (as I think they should), then they don’t change anything about the 
rules of collision. For example, the problem already exists today with 
associated types:

protocol Foo {
    associatedtype Inner: IntegerType
    func foo(inner: Inner)
}

protocol Bar {
    associatedtype Inner: FloatingPointType
    var inner: Inner { get }
}

struct FooBarImpl: Foo, Bar { // error: Type ‘FooBarImpl’ does not conform to 
protocol ‘Bar'
    func foo(inner: Int) {}
    var inner: Float
}

Type aliasing would not change anything about the fact that those collisions 
already exists in the language and are not very well handled: either they are 
meant to be forbidden but in that case we need better diagnostics, or we want 
to have a way to work around them. Perhaps you’d like to start a discussion 
around fixing that ?

> On 09 May 2016, at 08:06, Xiaodi Wu <[email protected]> wrote:
> 
> I see your point that nothing breaks in the stdlib with your proposal alone. 
> It's undeniably true--by construction!--that a purely additive feature, if 
> never used, will not cause problems.
> 
> That said, since the time that this feature was outlined in Doug's manifesto, 
> I have been wondering how clashes such as the examples in my previous email 
> are to be handled--i.e. what the rules of the language are to be--which I 
> think is certainly germane to your proposal. Can a conforming type override a 
> protocol typealias? Can a type conform to two protocols with conflicting 
> typealiases if all requirements are otherwise satisfied? Surely, these merit 
> discussion in your proposal.
> 
> On Mon, May 9, 2016 at 12:48 AM David Hart <[email protected] 
> <mailto:[email protected]>> wrote:
> Hello Xiaodi,
> 
> What I mean by there is no impact on existing code is that the language 
> change has no impact. Of course, if the Standard Library then declares a 
> typealias Element in Sequence, it will clash with code which has declared an 
> Element typealias in sub-protocols, but that is separate from the proposal.
> 
>> On 09 May 2016, at 07:28, Xiaodi Wu <[email protected] 
>> <mailto:[email protected]>> wrote:
>> 
>> If the protocol Sequence has typealias Element, does that mean I also have 
>> MyConformingSequence.Element?
>> 
>> If so, I think there is a potential impact on existing code not mentioned. 
>> Suppose MyConformingSequence already (unwisely) declares typealias Element. 
>> Now, what happens when I try to migrate my code to your proposed version of 
>> Swift?
>> 
>> This is a toy example, of course. More generally, though, I wonder about 
>> this question:
>> 
>> Suppose two protocols A and B each declare typealias Element. These 
>> typealiases are, as you proposed, intended to simplify referencing indirect 
>> associated types. But are they themselves considered protocol requirements?
>> 
>> I ask because, suppose I want to conform type T to A and B. I implement all 
>> the required methods and properties for such conformance. I declare the 
>> appropriate typealiases for the associatedtypes declared in both protocols. 
>> But, if A.Element and B.Element are incompatible with each other, it is 
>> nonetheless impossible to conform T to both A and B? If it's forbidden, 
>> isn't that kind of a bummer, since what's getting in the way is a naming 
>> clash arising from a facility intended to simplify the naming of things 
>> rather than provide for new functionality? If it's permitted, what is 
>> T.Element? Some clarity here would be nice.
>> On Sun, May 8, 2016 at 6:17 PM David Hart via swift-evolution 
>> <[email protected] <mailto:[email protected]>> wrote:
>> Hello,
>> 
>> I’ve come again with another proposal directly from the Generics Manifesto. 
>> Please let me know if it needs any modifications before sending the pull 
>> request.
>> 
>> Typealiases in protocols and protocol extensions
>> 
>> Proposal: SE-XXXX 
>> <https://github.com/hartbit/swift-evolution/blob/typealiases-in-protocols/proposals/XXXX-typealiases-in-protocols.md>
>> Authors: David Hart <https://github.com/hartbit>, Doug Gregor 
>> <https://github.com/DougGregor>
>> Status: TBD
>> Review manager: TBD
>>  
>> <https://github.com/hartbit/swift-evolution/blob/typealiases-in-protocols/proposals/XXXX-typealiases-in-protocols.md#introduction>Introduction
>> 
>> This proposal is from the Generics Manifesto 
>> <https://github.com/apple/swift/blob/master/docs/GenericsManifesto.md> and 
>> brings the typealias keyword back into protocols for type aliasing.
>> 
>>  
>> <https://github.com/hartbit/swift-evolution/blob/typealiases-in-protocols/proposals/XXXX-typealiases-in-protocols.md#motivation>Motivation
>> 
>> In Swift versions prior to 2.2, the typelias keyword was used outside of 
>> protocols to declare type aliases and in protocols to declare associated 
>> types. Since SE-0011 
>> <https://github.com/apple/swift-evolution/blob/master/proposals/0011-replace-typealias-associated.md>
>>  and Swift 2.2, associated type now use the associatedtype keyword and 
>> typelias is available for implementing true associated type aliases. 
>> 
>>  
>> <https://github.com/hartbit/swift-evolution/blob/typealiases-in-protocols/proposals/XXXX-typealiases-in-protocols.md#proposed-solution>Proposed
>>  solution
>> 
>> The solution allows the creation of associated type aliases. Here is an 
>> example from the standard library:
>> 
>> protocol Sequence {
>>   associatedtype Iterator : IteratorProtocol
>>   typealias Element = Iterator.Element
>> }
>> The example above shows how this simplifies referencing indirect associated 
>> types:
>> 
>> func sum<T: Sequence where T.Element == Int>(sequence: T) -> Int {
>>     return sequence.reduce(0, combine: +)
>> }
>>  
>> <https://github.com/hartbit/swift-evolution/blob/typealiases-in-protocols/proposals/XXXX-typealiases-in-protocols.md#detailed-design>Detailed
>>  design
>> 
>> The following grammar rules needs to be added:
>> 
>> protocol-member-declaration → protocol-typealias-declaration
>> 
>> protocol-typealias-declaration → typealias-declaration
>> 
>>  
>> <https://github.com/hartbit/swift-evolution/blob/typealiases-in-protocols/proposals/XXXX-typealiases-in-protocols.md#impact-on-existing-code>Impact
>>  on existing code
>> 
>> This will have no impact on existing code, but will probably require 
>> improving the Fix-It that was created for migrating typealias to 
>> associatedtype in Swift 2.2.
>> _______________________________________________
>> 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