What's the rationale for having associatedtype in protocols and typealias in 
the conforming types?

This has actually been a point of confusion for me as it seems inconsistent 

Brandon

Sent from my iPad

> On Jun 29, 2016, at 1:33 AM, Douglas Gregor via swift-evolution 
> <swift-evolution@swift.org> wrote:
> 
> 
>> On Jun 24, 2016, at 10:50 PM, Austin Zheng via swift-evolution 
>> <swift-evolution@swift.org> wrote:
>> 
>> Hello all,
>> 
>> Per Chris Lattner's list of open Swift 3 design topics 
>> (http://article.gmane.org/gmane.comp.lang.swift.evolution/21369), I've put 
>> together a proposal for removing type inference for associated types.
>> 
>> It can be found here: 
>> https://github.com/austinzheng/swift-evolution/blob/az-assoctypeinf/proposals/XXXX-remove-assoctype-inference.md
>> 
>> Thoughts, criticism, and feedback welcome. There are at least two slightly 
>> different designs in the proposal, and I'm sure people will have ideas for 
>> even more.
> 
> Thanks for working on this. I have a couple of comments.
> 
> I don’t think we should be adding the ability to write ‘associatedtype’ 
> declarations in classes/structs/enums. We already have the ability to 
> explicitly state the associated type witness by declaring a typealias, 
> struct, enum, or class with the appropriate name. Indeed, I feel like a lot 
> of complexity of the proposal is linked to adding  ‘associatedtype’ 
> declarations into the language, and I’d rather this proposal stay narrow.
> 
> I think it’s important for this proposal to show the other ways in which one 
> can get associated type witnesses without writing them explicitly in the 
> conforming type, even once inference goes away. For example, we have 
> associated type defaults, e.g.,
> 
>       protocol P {
>         associatedtype Associated = Int
>       }
> 
>       struct X : P {
>         // Associated becomes Int if not otherwise specified
>       }
> 
> and with typealiases in protocol extensions becoming real and useful, one 
> could also use protocol extensions:
> 
>       protocol P2 {
>         associatedtype Index
>       }
> 
>       extension P2 {
>         typealias Index = Int
>       }
> 
> which, of course, implies that one can use various tricks with constrained 
> protocol extensions and such. There isn’t any proposed change here, but it 
> illustrates that Swift programmers aren’t without recourse if type inference 
> for associated types go away.
> 
> One concern with applying the above tricks is that existing code can change 
> meaning when inference goes away. For example, let’s think about the 
> “Iterator” type of a Sequence. It already uses default associated type 
> witnesses (not associated type witness inference!) to give a default of 
> IndexingIterator<Self>, e.g.,
> 
>       protocol Sequence {
>         associatedtype Iterator: IteratorType
>         func makeIterator() -> Iterator
>       }
> 
>       protocol Collection : Sequence {
>         associatedtype Iterator = IndexingIterator<Self>
>         func makeIterator() -> Iterator  // redeclaration helps inference
>       }
> 
> When a type that conforms to Collection doesn’t provide makeIterator, it gets 
> a default one via:
> 
>       extension Collection where Iterator == IndexingIterator<Self> {
>         public func makeIterator() -> IndexingIterator<Self> { … }
>       }
> 
> That will still work (yay). However, simply removing associated type 
> inference means that a collection type that *does* provide makeIterator()—but 
> not, directly, Iterator—would change behavior:
> 
>       struct IntCollection : Collection {
>         typealias Element = Int
>         func makeIterator() -> IntCollectionIterator { … }
>       }
> 
> With associated type inference, we infer Iterator = IntCollectionIterator and 
> select IntCollection.makeIterator() to satisfy the makeIterator() requirement.
> 
> Without associated type inference, we use the default Iterator = 
> IndexingIterator<Self> and select the makeIterator() from the protocol 
> extension (because IntCollection.makeIterator() now returns the wrong type), 
> which turns an error of omission into an unpleasant surprise. We might need 
> something like near-miss checking for defaulted protocol requirements (which 
> we discussed in the thread at 
> http://thread.gmane.org/gmane.comp.lang.swift.devel/1799) to help find those 
> surprises. They already exist today, of course, but removing associated type 
> inference would make them worse.
> 
> Finally, one of the chief concerns is that we won’t be able to provide a nice 
> experience when conforming to the standard library’s collection protocols. I 
> would *love* to see some more thought to into how we can use the above tools 
> to handle it, although I suspect the only way to do that is to implement some 
> part of this proposal experimentally and see what it takes to get the 
> standard library and it’s tests working again. How far can the tools above go 
> toward reducing the need to specify various associated type witnesses in 
> conforming types? What are the surprises?
> 
>       - Doug
> 
> 
> _______________________________________________
> swift-evolution mailing list
> swift-evolution@swift.org
> 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