<html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"></head><body style="-ms-word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;"><div><div style="font-family: Calibri,sans-serif; font-size: 11pt;">-1. I don't really see how this is a bad thing and why it has to change. To me this is one of the best features of the language and I want more of it (I've been through some situations it was totally obvious the expected type of a variable and the compiler couldn't infer it) not less.<br><br></div></div><div dir="ltr"><hr><span style="font-family: Calibri,sans-serif; font-size: 11pt; font-weight: bold;">From: </span><span style="font-family: Calibri,sans-serif; font-size: 11pt;"><a href="mailto:swift-evolution@swift.org">Matthew Johnson via swift-evolution</a></span><br><span style="font-family: Calibri,sans-serif; font-size: 11pt; font-weight: bold;">Sent: </span><span style="font-family: Calibri,sans-serif; font-size: 11pt;">‎25/‎05/‎2016 07:06 PM</span><br><span style="font-family: Calibri,sans-serif; font-size: 11pt; font-weight: bold;">To: </span><span style="font-family: Calibri,sans-serif; font-size: 11pt;"><a href="mailto:david@hartbit.com">David Hart</a></span><br><span style="font-family: Calibri,sans-serif; font-size: 11pt; font-weight: bold;">Cc: </span><span style="font-family: Calibri,sans-serif; font-size: 11pt;"><a href="mailto:swift-evolution@swift.org">Swift-evolution</a></span><br><span style="font-family: Calibri,sans-serif; font-size: 11pt; font-weight: bold;">Subject: </span><span style="font-family: Calibri,sans-serif; font-size: 11pt;">Re: [swift-evolution] [Pitch] Remove associated type inference</span><br><br></div><div>I agree that if we’re going to do it we should probably do it in Swift 3. &nbsp;But it is a very convenient and useful feature that significantly lowers the bar of conforming to protocols with associated types (in many cases you can just implement the required members without thinking about the associated types). &nbsp;I think we should have a more detailed and compelling story about why we’re considering this change than I see in this proposal.</div><div><br></div>Are there any benefits users might receive from this change (assuming type checker architecture and bugs could eventually be ironed out)? &nbsp;Is it actively blocking desirable new features? &nbsp;If so what are they and in what way are they blocked?<div><br></div><div><div><br><div><blockquote type="cite"><div>On May 25, 2016, at 4:43 PM, David Hart via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a>&gt; wrote:</div><br class="Apple-interchange-newline"><div><div style="-ms-word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;">Here’s a pitch for removing associated type inference as per the Generics Manifesto. If we want to do it, we’d better do it before Swift 3:<div><br></div><div><h1 style='color: rgb(51, 51, 51); line-height: 1.2; padding-bottom: 0.3em; font-family: "Helvetica Neue", Helvetica, "Segoe UI", Arial, freesans, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; font-size: 2.25em; margin-top: 0px !important; margin-right: 0px; margin-bottom: 16px; margin-left: 0px; border-bottom-color: rgb(238, 238, 238); border-bottom-width: 1px; border-bottom-style: solid; box-sizing: border-box; background-color: rgb(255, 255, 255);'>Remove associated type inference</h1><ul style='color: rgb(51, 51, 51); padding-left: 2em; font-family: "Helvetica Neue", Helvetica, "Segoe UI", Arial, freesans, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; font-size: 16px; margin-top: 0px; margin-bottom: 16px; box-sizing: border-box; background-color: rgb(255, 255, 255);'><li style="box-sizing: border-box;">Proposal:&nbsp;<a style="color: rgb(64, 120, 192); text-decoration: none; box-sizing: border-box; background-color: transparent; -webkit-text-decoration-skip: objects;" href="https://github.com/apple/swift-evolution/blob/master/proposals/XXXX-remove-associated-type-inference.md">SE-XXXX</a></li><li style="box-sizing: border-box;">Author:&nbsp;<a style="color: rgb(64, 120, 192); text-decoration: none; box-sizing: border-box; background-color: transparent; -webkit-text-decoration-skip: objects;" href="https://github.com/hartbit">David Hart</a>,&nbsp;<a style="color: rgb(64, 120, 192); text-decoration: none; box-sizing: border-box; background-color: transparent; -webkit-text-decoration-skip: objects;" href="https://github.com/DougGregor">Douglas Gregor</a></li><li style="box-sizing: border-box;">Status: TBD</li><li style="box-sizing: border-box;">Review manager: TBD</li></ul><h2 style='color: rgb(51, 51, 51); line-height: 1.225; padding-bottom: 0.3em; font-family: "Helvetica Neue", Helvetica, "Segoe UI", Arial, freesans, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; font-size: 1.75em; margin-top: 1em; margin-bottom: 16px; border-bottom-color: rgb(238, 238, 238); border-bottom-width: 1px; border-bottom-style: solid; box-sizing: border-box; background-color: rgb(255, 255, 255);'><a class="anchor" id="user-content-introduction" aria-hidden="true" style="color: rgb(64, 120, 192); line-height: 1; padding-right: 2px; text-decoration: none; margin-left: -18px; display: inline-block; box-sizing: border-box; background-color: transparent; -webkit-text-decoration-skip: objects;" href="https://github.com/hartbit/swift-evolution/blob/remove-associated-type-inference/proposals/XXXX-remove-associated-type-inference.md#introduction"><svg xmlns="http://www.w3.org/2000/svg" class="octicon octicon-link" aria-hidden="true" viewBox="0 0 16 16" width="16" height="16" version="1.1"><path d="M 4 9 h 1 v 1 h -1 c -1.5 0 -3 -1.69 -3 -3.5 s 1.55 -3.5 3 -3.5 h 4 c 1.45 0 3 1.69 3 3.5 c 0 1.41 -0.91 2.72 -2 3.25 v -1.16 c 0.58 -0.45 1 -1.27 1 -2.09 c 0 -1.28 -1.02 -2.5 -2 -2.5 H 4 c -0.98 0 -2 1.22 -2 2.5 s 1 2.5 2 2.5 Z m 9 -3 h -1 v 1 h 1 c 1 0 2 1.22 2 2.5 s -1.02 2.5 -2 2.5 H 9 c -0.98 0 -2 -1.22 -2 -2.5 c 0 -0.83 0.42 -1.64 1 -2.09 v -1.16 c -1.09 0.53 -2 1.84 -2 3.25 c 0 1.81 1.55 3.5 3 3.5 h 4 c 1.45 0 3 -1.69 3 -3.5 s -1.5 -3.5 -3 -3.5 Z" /></svg></a>Introduction</h2><p style='color: rgb(51, 51, 51); font-family: "Helvetica Neue", Helvetica, "Segoe UI", Arial, freesans, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; font-size: 16px; margin-top: 0px; margin-bottom: 16px; box-sizing: border-box; background-color: rgb(255, 255, 255);'>This proposal seeks to remove the inference of associated types in types conforming to protocols.</p><h2 style='color: rgb(51, 51, 51); line-height: 1.225; padding-bottom: 0.3em; font-family: "Helvetica Neue", Helvetica, "Segoe UI", Arial, freesans, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; font-size: 1.75em; margin-top: 1em; margin-bottom: 16px; border-bottom-color: rgb(238, 238, 238); border-bottom-width: 1px; border-bottom-style: solid; box-sizing: border-box; background-color: rgb(255, 255, 255);'><a class="anchor" id="user-content-motivation" aria-hidden="true" style="color: rgb(64, 120, 192); line-height: 1; padding-right: 2px; text-decoration: none; margin-left: -18px; display: inline-block; box-sizing: border-box; background-color: transparent; -webkit-text-decoration-skip: objects;" href="https://github.com/hartbit/swift-evolution/blob/remove-associated-type-inference/proposals/XXXX-remove-associated-type-inference.md#motivation"><svg xmlns="http://www.w3.org/2000/svg" class="octicon octicon-link" aria-hidden="true" viewBox="0 0 16 16" width="16" height="16" version="1.1"><path d="M 4 9 h 1 v 1 h -1 c -1.5 0 -3 -1.69 -3 -3.5 s 1.55 -3.5 3 -3.5 h 4 c 1.45 0 3 1.69 3 3.5 c 0 1.41 -0.91 2.72 -2 3.25 v -1.16 c 0.58 -0.45 1 -1.27 1 -2.09 c 0 -1.28 -1.02 -2.5 -2 -2.5 H 4 c -0.98 0 -2 1.22 -2 2.5 s 1 2.5 2 2.5 Z m 9 -3 h -1 v 1 h 1 c 1 0 2 1.22 2 2.5 s -1.02 2.5 -2 2.5 H 9 c -0.98 0 -2 -1.22 -2 -2.5 c 0 -0.83 0.42 -1.64 1 -2.09 v -1.16 c -1.09 0.53 -2 1.84 -2 3.25 c 0 1.81 1.55 3.5 3 3.5 h 4 c 1.45 0 3 -1.69 3 -3.5 s -1.5 -3.5 -3 -3.5 Z" /></svg></a>Motivation</h2><p style='color: rgb(51, 51, 51); font-family: "Helvetica Neue", Helvetica, "Segoe UI", Arial, freesans, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; font-size: 16px; margin-top: 0px; margin-bottom: 16px; box-sizing: border-box; background-color: rgb(255, 255, 255);'>Even if associated types inference in a useful feature, it is also a big source of bugs in the compiler. This proposal argues that the usefulness does not outweight its architectural complexity. As per the&nbsp;<a style="color: rgb(64, 120, 192); text-decoration: none; box-sizing: border-box; background-color: transparent; -webkit-text-decoration-skip: objects;" href="https://github.com/apple/swift/blob/master/docs/GenericsManifesto.md">Generics Manifesto</a>:</p><blockquote style='margin: 0px 0px 16px; padding: 0px 15px; color: rgb(119, 119, 119); font-family: "Helvetica Neue", Helvetica, "Segoe UI", Arial, freesans, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; font-size: 16px; border-left-color: rgb(221, 221, 221); border-left-width: 4px; border-left-style: solid; box-sizing: border-box; background-color: rgb(255, 255, 255);'><div style="margin-top: 0px; margin-bottom: 0px; box-sizing: border-box;">associated type inference is the only place in Swift where we have a global type inference problem: it has historically been a major source of bugs, and implementing it fully and correctly requires a drastically different architecture to the type checker.</div></blockquote><p style='color: rgb(51, 51, 51); font-family: "Helvetica Neue", Helvetica, "Segoe UI", Arial, freesans, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; font-size: 16px; margin-top: 0px; margin-bottom: 16px; box-sizing: border-box; background-color: rgb(255, 255, 255);'>Because this is a breaking change, it would be beneficial to implement it for Swift 3.&nbsp;</p><h2 style='color: rgb(51, 51, 51); line-height: 1.225; padding-bottom: 0.3em; font-family: "Helvetica Neue", Helvetica, "Segoe UI", Arial, freesans, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; font-size: 1.75em; margin-top: 1em; margin-bottom: 16px; border-bottom-color: rgb(238, 238, 238); border-bottom-width: 1px; border-bottom-style: solid; box-sizing: border-box; background-color: rgb(255, 255, 255);'><a class="anchor" id="user-content-detailed-design" aria-hidden="true" style="color: rgb(64, 120, 192); line-height: 1; padding-right: 2px; text-decoration: none; margin-left: -18px; display: inline-block; box-sizing: border-box; background-color: transparent; -webkit-text-decoration-skip: objects;" href="https://github.com/hartbit/swift-evolution/blob/remove-associated-type-inference/proposals/XXXX-remove-associated-type-inference.md#detailed-design"><svg xmlns="http://www.w3.org/2000/svg" class="octicon octicon-link" aria-hidden="true" viewBox="0 0 16 16" width="16" height="16" version="1.1"><path d="M 4 9 h 1 v 1 h -1 c -1.5 0 -3 -1.69 -3 -3.5 s 1.55 -3.5 3 -3.5 h 4 c 1.45 0 3 1.69 3 3.5 c 0 1.41 -0.91 2.72 -2 3.25 v -1.16 c 0.58 -0.45 1 -1.27 1 -2.09 c 0 -1.28 -1.02 -2.5 -2 -2.5 H 4 c -0.98 0 -2 1.22 -2 2.5 s 1 2.5 2 2.5 Z m 9 -3 h -1 v 1 h 1 c 1 0 2 1.22 2 2.5 s -1.02 2.5 -2 2.5 H 9 c -0.98 0 -2 -1.22 -2 -2.5 c 0 -0.83 0.42 -1.64 1 -2.09 v -1.16 c -1.09 0.53 -2 1.84 -2 3.25 c 0 1.81 1.55 3.5 3 3.5 h 4 c 1.45 0 3 -1.69 3 -3.5 s -1.5 -3.5 -3 -3.5 Z" /></svg></a>Detailed Design</h2><p style='color: rgb(51, 51, 51); font-family: "Helvetica Neue", Helvetica, "Segoe UI", Arial, freesans, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; font-size: 16px; margin-top: 0px; margin-bottom: 16px; box-sizing: border-box; background-color: rgb(255, 255, 255);'>The proposal would remove associated type inference and make code which relied on it invalid:</p><div class="highlight highlight-source-swift" style='color: rgb(51, 51, 51); font-family: "Helvetica Neue", Helvetica, "Segoe UI", Arial, freesans, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; font-size: 16px; margin-bottom: 16px; box-sizing: border-box; background-color: rgb(255, 255, 255);'><pre style='padding: 16px; border-radius: 3px; line-height: 1.45; overflow: auto; font-family: Consolas, "Liberation Mono", Menlo, Courier, monospace; font-size: 14px; margin-top: 0px; margin-bottom: 0px; -ms-word-break: normal; -ms-word-wrap: normal; box-sizing: border-box; background-color: rgb(247, 247, 247);'><span class="pl-k" style="color: rgb(167, 29, 93); box-sizing: border-box;">protocol</span> IteratorProtocol {
  associatedtype Element
  <span class="pl-k" style="color: rgb(167, 29, 93); box-sizing: border-box;">mutating</span> <span class="pl-k" style="color: rgb(167, 29, 93); box-sizing: border-box;">func</span> <span class="pl-en" style="color: rgb(121, 93, 163); box-sizing: border-box;">next</span>() <span class="pl-k" style="color: rgb(167, 29, 93); box-sizing: border-box;">-&gt;</span> Element?
}

<span class="pl-k" style="color: rgb(167, 29, 93); box-sizing: border-box;">struct</span> IntIterator <span class="pl-k" style="color: rgb(167, 29, 93); box-sizing: border-box;">:</span> IteratorProtocol {
  <span class="pl-k" style="color: rgb(167, 29, 93); box-sizing: border-box;">mutating</span> <span class="pl-k" style="color: rgb(167, 29, 93); box-sizing: border-box;">func</span> <span class="pl-en" style="color: rgb(121, 93, 163); box-sizing: border-box;">next</span>() <span class="pl-k" style="color: rgb(167, 29, 93); box-sizing: border-box;">-&gt;</span> <span class="pl-c1" style="color: rgb(0, 134, 179); box-sizing: border-box;">Int</span>? { <span class="pl-k" style="color: rgb(167, 29, 93); box-sizing: border-box;">...</span> }  <span class="pl-c" style="color: rgb(150, 152, 150); box-sizing: border-box;">// used to infer Element = Int</span>
}</pre></div><p style='color: rgb(51, 51, 51); font-family: "Helvetica Neue", Helvetica, "Segoe UI", Arial, freesans, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; font-size: 16px; margin-top: 0px; margin-bottom: 16px; box-sizing: border-box; background-color: rgb(255, 255, 255);'>The compiler would generate an error message stating:&nbsp;<code style='margin: 0px; padding: 0.2em 0px; border-radius: 3px; font-family: Consolas, "Liberation Mono", Menlo, Courier, monospace; font-size: 14px; box-sizing: border-box; background-color: rgba(0, 0, 0, 0.039215);'>error: IntIterator is missing its Element associated type declaration</code>. The code would have to be modified as follows to fix the error:</p><div class="highlight highlight-source-swift" style='color: rgb(51, 51, 51); font-family: "Helvetica Neue", Helvetica, "Segoe UI", Arial, freesans, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; font-size: 16px; margin-bottom: 16px; box-sizing: border-box; background-color: rgb(255, 255, 255);'><pre style='padding: 16px; border-radius: 3px; line-height: 1.45; overflow: auto; font-family: Consolas, "Liberation Mono", Menlo, Courier, monospace; font-size: 14px; margin-top: 0px; margin-bottom: 0px; -ms-word-break: normal; -ms-word-wrap: normal; box-sizing: border-box; background-color: rgb(247, 247, 247);'><span class="pl-k" style="color: rgb(167, 29, 93); box-sizing: border-box;">struct</span> IntIterator <span class="pl-k" style="color: rgb(167, 29, 93); box-sizing: border-box;">:</span> IteratorProtocol {
    <span class="pl-k" style="color: rgb(167, 29, 93); box-sizing: border-box;">typealias</span> Element <span class="pl-k" style="color: rgb(167, 29, 93); box-sizing: border-box;">=</span> <span class="pl-c1" style="color: rgb(0, 134, 179); box-sizing: border-box;">Int</span>
    <span class="pl-k" style="color: rgb(167, 29, 93); box-sizing: border-box;">mutating</span> <span class="pl-k" style="color: rgb(167, 29, 93); box-sizing: border-box;">func</span> <span class="pl-en" style="color: rgb(121, 93, 163); box-sizing: border-box;">next</span>() <span class="pl-k" style="color: rgb(167, 29, 93); box-sizing: border-box;">-&gt;</span> <span class="pl-c1" style="color: rgb(0, 134, 179); box-sizing: border-box;">Int</span>? { <span class="pl-k" style="color: rgb(167, 29, 93); box-sizing: border-box;">return</span> <span class="pl-c1" style="color: rgb(0, 134, 179); box-sizing: border-box;">nil</span> }  <span class="pl-c" style="color: rgb(150, 152, 150); box-sizing: border-box;">// used to infer Element = Int</span>
}</pre></div><h2 style='color: rgb(51, 51, 51); line-height: 1.225; padding-bottom: 0.3em; font-family: "Helvetica Neue", Helvetica, "Segoe UI", Arial, freesans, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; font-size: 1.75em; margin-top: 1em; margin-bottom: 16px; border-bottom-color: rgb(238, 238, 238); border-bottom-width: 1px; border-bottom-style: solid; box-sizing: border-box; background-color: rgb(255, 255, 255);'><a class="anchor" id="user-content-impact-on-existing-code" aria-hidden="true" style="color: rgb(64, 120, 192); line-height: 1; padding-right: 2px; text-decoration: none; margin-left: -18px; display: inline-block; box-sizing: border-box; background-color: transparent; -webkit-text-decoration-skip: objects;" href="https://github.com/hartbit/swift-evolution/blob/remove-associated-type-inference/proposals/XXXX-remove-associated-type-inference.md#impact-on-existing-code"><svg xmlns="http://www.w3.org/2000/svg" class="octicon octicon-link" aria-hidden="true" viewBox="0 0 16 16" width="16" height="16" version="1.1"><path d="M 4 9 h 1 v 1 h -1 c -1.5 0 -3 -1.69 -3 -3.5 s 1.55 -3.5 3 -3.5 h 4 c 1.45 0 3 1.69 3 3.5 c 0 1.41 -0.91 2.72 -2 3.25 v -1.16 c 0.58 -0.45 1 -1.27 1 -2.09 c 0 -1.28 -1.02 -2.5 -2 -2.5 H 4 c -0.98 0 -2 1.22 -2 2.5 s 1 2.5 2 2.5 Z m 9 -3 h -1 v 1 h 1 c 1 0 2 1.22 2 2.5 s -1.02 2.5 -2 2.5 H 9 c -0.98 0 -2 -1.22 -2 -2.5 c 0 -0.83 0.42 -1.64 1 -2.09 v -1.16 c -1.09 0.53 -2 1.84 -2 3.25 c 0 1.81 1.55 3.5 3 3.5 h 4 c 1.45 0 3 -1.69 3 -3.5 s -1.5 -3.5 -3 -3.5 Z" /></svg></a>Impact on Existing Code</h2><p style='color: rgb(51, 51, 51); font-family: "Helvetica Neue", Helvetica, "Segoe UI", Arial, freesans, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; font-size: 16px; margin-top: 0px; margin-bottom: 16px; box-sizing: border-box; background-color: rgb(255, 255, 255);'>This is a breaking change that will require conforming types which relied on the inference, including in the Standard Library, to explicitly declare associated types. A Fix-It could be introduced to add the&nbsp;<code style='margin: 0px; padding: 0.2em 0px; border-radius: 3px; font-family: Consolas, "Liberation Mono", Menlo, Courier, monospace; font-size: 14px; box-sizing: border-box; background-color: rgba(0, 0, 0, 0.039215);'>typealias</code>&nbsp;and leave the type to be filled in. That way, all the type inference could be removed from the compiler.</p><h2 style='color: rgb(51, 51, 51); line-height: 1.225; padding-bottom: 0.3em; font-family: "Helvetica Neue", Helvetica, "Segoe UI", Arial, freesans, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; font-size: 1.75em; margin-top: 1em; margin-bottom: 16px; border-bottom-color: rgb(238, 238, 238); border-bottom-width: 1px; border-bottom-style: solid; box-sizing: border-box; background-color: rgb(255, 255, 255);'><a class="anchor" id="user-content-alternatives-considered" aria-hidden="true" style="color: rgb(64, 120, 192); line-height: 1; padding-right: 2px; text-decoration: none; margin-left: -18px; display: inline-block; box-sizing: border-box; background-color: transparent; -webkit-text-decoration-skip: objects;" href="https://github.com/hartbit/swift-evolution/blob/remove-associated-type-inference/proposals/XXXX-remove-associated-type-inference.md#alternatives-considered"><svg xmlns="http://www.w3.org/2000/svg" class="octicon octicon-link" aria-hidden="true" viewBox="0 0 16 16" width="16" height="16" version="1.1" /></a></h2></div></div></div></blockquote></div></div></div><br><div>[The entire original message is not included.]</div></body></html>