Sometimes I get the sense that the pleasure of discussing takes precedence over 
the goal it serves, namely to create a language that will be the most 
attractive it can be within a given complexity budget (meaning a balance 
between the immediate reward of shiny new things and the long term evolvability 
of the compiler). I seem to recall this item coming directly from chris as a 
compiler cleanup task.

> On Jun 25, 2016, at 3:23 PM, Matthew Johnson via swift-evolution 
> <swift-evolution@swift.org> wrote:
> 
> Hi Austin,
> 
> I’m sorry to say, but this proposal makes me really sad.  I consider 
> associated type inference one of the more elegant aspects of Swift.  It would 
> be very unfortunate to lose it.  
> 
> I am really pleased to see that Dmitri has offered an alternative that looks 
> very reasonable.  I’m hoping the Doug or Chris (or someone else from the core 
> team) can chime in on the feasibility of this alternative.  If it is 
> considered viable and Dmitri isn’t able to write the proposal I would be 
> happy to do so.
> 
> If the alternative isn’t viable and we must proceed with a proposal to remove 
> inference I think there is one crucial thing to consider that isn’t discussed 
> in this proposal: retroactive modeling.  As far as I can tell, this proposal 
> will *prohibit* some types from conforming to some protocols.  Specifically, 
> if a type defines a typealias with a name that matches the name of an 
> associatedtype in a protocol it would not be possible to retroactively model 
> that protocol.  Because of the name conflict an associatedtype declaration 
> would not be allowed and the existing typealias would not meet the 
> requirement.  Consider this example:
> 
> // Module A
> public struct S {
>     public typealias Foo = Int
> }
> 
> // Module B
> public protocol P {
>     associatedtype Foo
> }
> 
> // Module C
> import A
> import B
> 
> // compiler error: `S` does not meet the `Foo` associatedtype requirement
> extension S : P {
>     // compiler error: cannot define associatedtype `Foo` for `S` which 
> already declares typealias `Foo`
>     associatedtype Foo = String
> }
> 
> I cannot support any proposal that breaks retroactive modeling in this way.
> 
> Another item that is not mentioned in this proposal is that typealias is not 
> the only way to meet an associatedtype requirement in the language today.  
> For example, this code is legal:
> 
> protocol Foo {
>     associatedtype Bar
> }
> struct S : Foo {
>     struct Bar {}
> }
> 
> If we *must* drop inference I prefer the alternative of just doing that: 
> dropping inference, but otherwise leaving things alone.  All associated type 
> requirements would need to be explicitly satisfied using one of the 
> mechanisms that is currently valid for satisfying a non-inferred associated 
> type requirement.  The ability to satisfy these requirements in a variety of 
> ways is a *benefit* that provides valuable flexibility.
> 
> I agree that something should look for a good solution to the subclass 
> typealias issue, but I don’t think this is it.  Ideally we would find a 
> solution that works well in the presence of retroactive modeling making code 
> such as the following valid:
> 
> // module A
> protocol P1 {
>     associatedtype Foo
> 
>    @infers(Foo)
>     var foo: Foo { get }
> }
> // module B
> protocol P2 {
>     associatedtype Foo
> 
>     @infers(Foo)
>     func bar() -> Foo
> }
> 
> // module C
> class Base {
>     let foo: String = "foo"
> }
> class Derived : Base {
>     func bar() -> Int { return 42 }
> }
> 
> // module D
> import A
> import B
> import C
> import D
> extension Base : P1 {}
> extension Derived : P2 {}
> 
> We don’t always control the protocol or type definitions we want to make work 
> together.  The ability to make code that “should work together” actually do 
> so with minimal fuss is one of the great things about Swift.  Any time we 
> interfere with retroactive modeling we increase the need for boilerplate 
> adapter types, etc.
> 
> One detail appears to be implied by the proposal but isn’t explicitly stated. 
>  Specifically, it looks like the intent is that other than only being valid 
> when used to meet a protocol requirement, associatedtype otherwise works like 
> a typealias.  It would be good to have this behavior clarified if the 
> proposal moves forward.
> 
> -Matthew
> 
> 
> 
>> On Jun 25, 2016, at 12:50 AM, 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.
>> 
>> Best,
>> Austin
>> _______________________________________________
>> 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
_______________________________________________
swift-evolution mailing list
swift-evolution@swift.org
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to