Sent from my iPhone

> On Jun 28, 2016, at 10:45 PM, Austin Zheng <austinzh...@gmail.com> wrote:
> 
> Thank you for your detailed feedback. Would it be helpful if I prepared a PR?

Yes, it would be very helpful. 

  - Doug

> 
> Austin
> 
>>> On Jun 28, 2016, at 10:33 PM, Douglas Gregor <dgre...@apple.com> 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

Reply via email to