<div dir="ltr">On Fri, Jun 23, 2017 at 8:29 PM, David Moore via swift-evolution <span dir="ltr">&lt;<a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a>&gt;</span> wrote:<br><div class="gmail_extra"><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex">



<div>
<div name="messageBodySection" style="font-size:14px;font-family:-apple-system,BlinkMacSystemFont,sans-serif">
<p style="margin:0px;font-stretch:normal;font-size:12px;line-height:normal;font-family:Helvetica;background-color:rgb(41,43,54);min-height:14px"><br></p>
<p style="margin:0px;font-stretch:normal;font-size:12px;line-height:normal;font-family:Menlo;color:rgb(231,232,235);background-color:rgb(41,43,54)"><span style="color:rgb(225,45,160)">protocol</span> Bondable {</p>
<p style="margin:0px;font-stretch:normal;font-size:12px;line-height:normal;font-family:Menlo;color:rgb(225,45,160);background-color:rgb(41,43,54)"><span style="color:rgb(231,232,235)">   </span> associatedtype <span style="color:rgb(231,232,235)">Key</span></p>
<p style="margin:0px;font-stretch:normal;font-size:12px;line-height:normal;font-family:Menlo;color:rgb(225,45,160);background-color:rgb(41,43,54)"><span style="color:rgb(231,232,235)">   </span> associatedtype <span style="color:rgb(231,232,235)">Value</span></p>
<p style="margin:0px;font-stretch:normal;font-size:12px;line-height:normal;font-family:Menlo;color:rgb(231,232,235);background-color:rgb(41,43,54);min-height:14px">    </p>
<p style="margin:0px;font-stretch:normal;font-size:12px;line-height:normal;font-family:Menlo;color:rgb(231,232,235);background-color:rgb(41,43,54)">    <span style="color:rgb(225,45,160)">static</span> <span style="color:rgb(225,45,160)">func</span> new() -&gt; <span style="color:rgb(41,160,159)">Self</span></p>
<p style="margin:0px;font-stretch:normal;font-size:12px;line-height:normal;font-family:Menlo;color:rgb(231,232,235);background-color:rgb(41,43,54);min-height:14px">    </p>
<p style="margin:0px;font-stretch:normal;font-size:12px;line-height:normal;font-family:Menlo;color:rgb(231,232,235);background-color:rgb(41,43,54)">    <span style="color:rgb(225,45,160)">func</span> value(forKey key: <span style="color:rgb(41,160,159)">Key</span>) -&gt; <span style="color:rgb(41,160,159)">Value</span>?</p>
<p style="margin:0px;font-stretch:normal;font-size:12px;line-height:normal;font-family:Menlo;color:rgb(231,232,235);background-color:rgb(41,43,54);min-height:14px">    </p>
<p style="margin:0px;font-stretch:normal;font-size:12px;line-height:normal;font-family:Menlo;color:rgb(231,232,235);background-color:rgb(41,43,54)">    <span style="color:rgb(225,45,160)">mutating</span> <span style="color:rgb(225,45,160)">func</span> updateValue(<span style="color:rgb(225,45,160)">_</span> value: <span style="color:rgb(41,160,159)">Value</span>?, forKey key: <span style="color:rgb(41,160,159)">Key</span>)</p>
<p style="margin:0px;font-stretch:normal;font-size:12px;line-height:normal;font-family:Menlo;color:rgb(231,232,235);background-color:rgb(41,43,54)">}</p>
<p style="margin:0px;font-stretch:normal;font-size:12px;line-height:normal;font-family:Helvetica;background-color:rgb(41,43,54);min-height:14px"><br></p>
<p style="margin:0px;font-stretch:normal;font-size:12px;line-height:normal;font-family:Menlo;color:rgb(41,160,159);background-color:rgb(41,43,54)"><span style="color:rgb(225,45,160)">extension</span> Dictionary<span style="color:rgb(231,232,235)">:</span> <span style="color:rgb(24,181,177)">Bondable</span> <span style="color:rgb(231,232,235)">{</span></p>
<p style="margin:0px;font-stretch:normal;font-size:12px;line-height:normal;font-family:Menlo;color:rgb(231,232,235);background-color:rgb(41,43,54)">    <span style="color:rgb(225,45,160)">static</span> <span style="color:rgb(225,45,160)">func</span> new() -&gt; <span style="color:rgb(41,160,159)">Dictionary</span>&lt;<span style="color:rgb(41,160,159)">Key</span>, <span style="color:rgb(41,160,159)">Value</span>&gt; {</p>
<p style="margin:0px;font-stretch:normal;font-size:12px;line-height:normal;font-family:Menlo;color:rgb(41,160,159);background-color:rgb(41,43,54)"><span style="color:rgb(231,232,235)">       </span> <span style="color:rgb(225,45,160)">return</span> Dictionary<span style="color:rgb(231,232,235)">&lt;</span>Key<span style="color:rgb(231,232,235)">,</span> Value<span style="color:rgb(231,232,235)">&gt;()</span></p>
<p style="margin:0px;font-stretch:normal;font-size:12px;line-height:normal;font-family:Menlo;color:rgb(231,232,235);background-color:rgb(41,43,54)">    }</p>
<p style="margin:0px;font-stretch:normal;font-size:12px;line-height:normal;font-family:Menlo;color:rgb(231,232,235);background-color:rgb(41,43,54);min-height:14px">    </p>
<p style="margin:0px;font-stretch:normal;font-size:12px;line-height:normal;font-family:Menlo;color:rgb(231,232,235);background-color:rgb(41,43,54)">    <span style="color:rgb(225,45,160)">func</span> value(forKey key: <span style="color:rgb(41,160,159)">Key</span>) -&gt; <span style="color:rgb(41,160,159)">Value</span>? {</p>
<p style="margin:0px;font-stretch:normal;font-size:12px;line-height:normal;font-family:Menlo;color:rgb(231,232,235);background-color:rgb(41,43,54)">        <span style="color:rgb(225,45,160)">return</span> <span style="color:rgb(225,45,160)">self</span>[key]</p>
<p style="margin:0px;font-stretch:normal;font-size:12px;line-height:normal;font-family:Menlo;color:rgb(231,232,235);background-color:rgb(41,43,54)">    }</p>
<p style="margin:0px;font-stretch:normal;font-size:12px;line-height:normal;font-family:Menlo;color:rgb(231,232,235);background-color:rgb(41,43,54);min-height:14px">    </p>
<p style="margin:0px;font-stretch:normal;font-size:12px;line-height:normal;font-family:Menlo;color:rgb(231,232,235);background-color:rgb(41,43,54)">    <span style="color:rgb(225,45,160)">mutating</span> <span style="color:rgb(225,45,160)">func</span> updateValue(<span style="color:rgb(225,45,160)">_</span> value: <span style="color:rgb(41,160,159)">Value</span>?, forKey key: <span style="color:rgb(41,160,159)">Key</span>) {</p>
<p style="margin:0px;font-stretch:normal;font-size:12px;line-height:normal;font-family:Menlo;color:rgb(231,232,235);background-color:rgb(41,43,54)">        <span style="color:rgb(225,45,160)">self</span>[key] = value</p>
<p style="margin:0px;font-stretch:normal;font-size:12px;line-height:normal;font-family:Menlo;color:rgb(231,232,235);background-color:rgb(41,43,54)">    }</p>
<p style="margin:0px;font-stretch:normal;font-size:12px;line-height:normal;font-family:Menlo;color:rgb(231,232,235);background-color:rgb(41,43,54)">}</p>
<p style="margin:0px;font-stretch:normal;font-size:12px;line-height:normal;font-family:Helvetica;background-color:rgb(41,43,54);min-height:14px"><br></p>
<p style="margin:0px;font-stretch:normal;font-size:12px;line-height:normal;font-family:Menlo;color:rgb(231,232,235);background-color:rgb(41,43,54)"><span style="color:rgb(225,45,160)">struct</span> Bridge&lt;A, B&gt; {</p>
<p style="margin:0px;font-stretch:normal;font-size:12px;line-height:normal;font-family:Menlo;color:rgb(231,232,235);background-color:rgb(41,43,54)">    <span style="color:rgb(225,45,160)">struct</span> Getter {</p>
<p style="margin:0px;font-stretch:normal;font-size:12px;line-height:normal;font-family:Menlo;color:rgb(231,232,235);background-color:rgb(41,43,54)">        <span style="color:rgb(225,45,160)">var</span> transform: ((<span style="color:rgb(24,181,177)">B</span>) -&gt; <span style="color:rgb(24,181,177)">A</span>?)</p>
<p style="margin:0px;font-stretch:normal;font-size:12px;line-height:normal;font-family:Menlo;color:rgb(231,232,235);background-color:rgb(41,43,54)">    }</p>
<p style="margin:0px;font-stretch:normal;font-size:12px;line-height:normal;font-family:Menlo;color:rgb(231,232,235);background-color:rgb(41,43,54);min-height:14px">    </p>
<p style="margin:0px;font-stretch:normal;font-size:12px;line-height:normal;font-family:Menlo;color:rgb(231,232,235);background-color:rgb(41,43,54)">    <span style="color:rgb(225,45,160)">struct</span> Setter {</p>
<p style="margin:0px;font-stretch:normal;font-size:12px;line-height:normal;font-family:Menlo;color:rgb(231,232,235);background-color:rgb(41,43,54)">        <span style="color:rgb(225,45,160)">var</span> transform: ((<span style="color:rgb(24,181,177)">A</span>) -&gt; <span style="color:rgb(24,181,177)">B</span>?)</p>
<p style="margin:0px;font-stretch:normal;font-size:12px;line-height:normal;font-family:Menlo;color:rgb(231,232,235);background-color:rgb(41,43,54)">    }</p>
<p style="margin:0px;font-stretch:normal;font-size:12px;line-height:normal;font-family:Menlo;color:rgb(231,232,235);background-color:rgb(41,43,54);min-height:14px">    </p>
<p style="margin:0px;font-stretch:normal;font-size:12px;line-height:normal;font-family:Menlo;color:rgb(231,232,235);background-color:rgb(41,43,54)">    <span style="color:rgb(225,45,160)">var</span> get: <span style="color:rgb(24,181,177)">Getter</span></p>
<p style="margin:0px;font-stretch:normal;font-size:12px;line-height:normal;font-family:Menlo;color:rgb(231,232,235);background-color:rgb(41,43,54)">    <span style="color:rgb(225,45,160)">var</span> set: <span style="color:rgb(24,181,177)">Setter</span></p>
<p style="margin:0px;font-stretch:normal;font-size:12px;line-height:normal;font-family:Menlo;color:rgb(231,232,235);background-color:rgb(41,43,54)">}</p>
<p style="margin:0px;font-stretch:normal;font-size:12px;line-height:normal;font-family:Helvetica;background-color:rgb(41,43,54);min-height:14px"><br></p>
<p style="margin:0px;font-stretch:normal;font-size:12px;line-height:normal;font-family:Menlo;color:rgb(231,232,235);background-color:rgb(41,43,54)"><span style="color:rgb(225,45,160)">protocol</span> Bonding {</p>
<p style="margin:0px;font-stretch:normal;font-size:12px;line-height:normal;font-family:Menlo;color:rgb(231,232,235);background-color:rgb(41,43,54)">    <span style="color:rgb(225,45,160)">associatedtype</span> Dictionary: <span style="color:rgb(24,181,177)">Bondable</span></p>
<p style="margin:0px;font-stretch:normal;font-size:12px;line-height:normal;font-family:Menlo;color:rgb(225,45,160);background-color:rgb(41,43,54)"><span style="color:rgb(231,232,235)">   </span> associatedtype <span style="color:rgb(231,232,235)">Value</span></p>
<p style="margin:0px;font-stretch:normal;font-size:12px;line-height:normal;font-family:Menlo;color:rgb(231,232,235);background-color:rgb(41,43,54);min-height:14px">    </p>
<p style="margin:0px;font-stretch:normal;font-size:12px;line-height:normal;font-family:Menlo;color:rgb(231,232,235);background-color:rgb(41,43,54)">    <span style="color:rgb(225,45,160)">var</span> key: <span style="color:rgb(41,160,159)">Dictionary</span>.<span style="color:rgb(41,160,159)">Key</span> { <span style="color:rgb(225,45,160)">get</span> <span style="color:rgb(225,45,160)">set</span> }</p>
<p style="margin:0px;font-stretch:normal;font-size:12px;line-height:normal;font-family:Menlo;color:rgb(231,232,235);background-color:rgb(41,43,54);min-height:14px">    </p>
<p style="margin:0px;font-stretch:normal;font-size:12px;line-height:normal;font-family:Menlo;color:rgb(231,232,235);background-color:rgb(41,43,54)">    <span style="color:rgb(225,45,160)">var</span> bridge: <span style="color:rgb(24,181,177)">Bridge</span>&lt;<span style="color:rgb(41,160,159)">Value</span>, <span style="color:rgb(41,160,159)">Dictionary</span>.<span style="color:rgb(41,160,159)">Value</span>&gt; { <span style="color:rgb(225,45,160)">get</span> <span style="color:rgb(225,45,160)">set</span> }</p>
<p style="margin:0px;font-stretch:normal;font-size:12px;line-height:normal;font-family:Menlo;color:rgb(231,232,235);background-color:rgb(41,43,54);min-height:14px">    </p>
<p style="margin:0px;font-stretch:normal;font-size:12px;line-height:normal;font-family:Menlo;color:rgb(231,232,235);background-color:rgb(41,43,54)">    <span style="color:rgb(225,45,160)">func</span> value(from aDictionary: <span style="color:rgb(41,160,159)">Dictionary</span>, using set: <span style="color:rgb(24,181,177)">Bridge</span>&lt;<span style="color:rgb(41,160,159)">Value</span>, <span style="color:rgb(41,160,159)">Dictionary</span>.<span style="color:rgb(41,160,159)">Value</span>&gt;.<span style="color:rgb(24,181,177)">Getter</span>) -&gt; <span style="color:rgb(41,160,159)">Value</span>?</p>
<p style="margin:0px;font-stretch:normal;font-size:12px;line-height:normal;font-family:Menlo;color:rgb(231,232,235);background-color:rgb(41,43,54);min-height:14px">    </p>
<p style="margin:0px;font-stretch:normal;font-size:12px;line-height:normal;font-family:Menlo;color:rgb(231,232,235);background-color:rgb(41,43,54)">    <span style="color:rgb(225,45,160)">func</span> addValue(<span style="color:rgb(225,45,160)">_</span> value: <span style="color:rgb(41,160,159)">Value</span>, to aDictionary: <span style="color:rgb(225,45,160)">inout</span> <span style="color:rgb(41,160,159)">Dictionary</span>, using get: <span style="color:rgb(24,181,177)">Bridge</span>&lt;<span style="color:rgb(41,160,159)">Value</span>, <span style="color:rgb(41,160,159)">Dictionary</span>.<span style="color:rgb(41,160,159)">Value</span>&gt;.<span style="color:rgb(24,181,177)">Setter</span>)</p>
<p style="margin:0px;font-stretch:normal;font-size:12px;line-height:normal;font-family:Menlo;color:rgb(231,232,235);background-color:rgb(41,43,54)">}</p>
<p style="margin:0px;font-stretch:normal;font-size:12px;line-height:normal;font-family:Helvetica;background-color:rgb(41,43,54);min-height:14px"><br></p>
<p style="margin:0px;font-stretch:normal;font-size:12px;line-height:normal;font-family:Menlo;color:rgb(225,45,160);background-color:rgb(41,43,54)">extension <span style="color:rgb(24,181,177)">Bonding</span> <span style="color:rgb(231,232,235)">{</span></p>
<p style="margin:0px;font-stretch:normal;font-size:12px;line-height:normal;font-family:Menlo;color:rgb(231,232,235);background-color:rgb(41,43,54);min-height:14px">    </p>
<p style="margin:0px;font-stretch:normal;font-size:12px;line-height:normal;font-family:Menlo;color:rgb(231,232,235);background-color:rgb(41,43,54)">    <span style="color:rgb(225,45,160)">func</span> value(from aDictionary: <span style="color:rgb(41,160,159)">Dictionary</span>, using get: <span style="color:rgb(24,181,177)">Bridge</span>&lt;<span style="color:rgb(41,160,159)">Value</span>, <span style="color:rgb(41,160,159)">Dictionary</span>.<span style="color:rgb(41,160,159)">Value</span>&gt;.<span style="color:rgb(24,181,177)">Getter</span>) -&gt; <span style="color:rgb(41,160,159)">Value</span>? {</p>
<p style="margin:0px;font-stretch:normal;font-size:12px;line-height:normal;font-family:Menlo;color:rgb(231,232,235);background-color:rgb(41,43,54)">        <span style="color:rgb(225,45,160)">if</span> <span style="color:rgb(225,45,160)">let</span> value = aDictionary.<span style="color:rgb(24,181,177)">value</span>(forKey: <span style="color:rgb(24,181,177)">key</span>) {</p>
<p style="margin:0px;font-stretch:normal;font-size:12px;line-height:normal;font-family:Menlo;color:rgb(231,232,235);background-color:rgb(41,43,54)">            <span style="color:rgb(225,45,160)">return</span> get.<span style="color:rgb(24,181,177)">transform</span>(value)</p>
<p style="margin:0px;font-stretch:normal;font-size:12px;line-height:normal;font-family:Menlo;color:rgb(231,232,235);background-color:rgb(41,43,54)">        } <span style="color:rgb(225,45,160)">else</span> {</p>
<p style="margin:0px;font-stretch:normal;font-size:12px;line-height:normal;font-family:Menlo;color:rgb(231,232,235);background-color:rgb(41,43,54)">            <span style="color:rgb(225,45,160)">return</span> <span style="color:rgb(225,45,160)">nil</span></p>
<p style="margin:0px;font-stretch:normal;font-size:12px;line-height:normal;font-family:Menlo;color:rgb(231,232,235);background-color:rgb(41,43,54);min-height:14px">            </p>
<p style="margin:0px;font-stretch:normal;font-size:12px;line-height:normal;font-family:Menlo;color:rgb(231,232,235);background-color:rgb(41,43,54)">        }</p>
<p style="margin:0px;font-stretch:normal;font-size:12px;line-height:normal;font-family:Menlo;color:rgb(231,232,235);background-color:rgb(41,43,54)">    }</p>
<p style="margin:0px;font-stretch:normal;font-size:12px;line-height:normal;font-family:Menlo;color:rgb(231,232,235);background-color:rgb(41,43,54);min-height:14px">    </p>
<p style="margin:0px;font-stretch:normal;font-size:12px;line-height:normal;font-family:Menlo;color:rgb(231,232,235);background-color:rgb(41,43,54)">    <span style="color:rgb(225,45,160)">func</span> addValue(<span style="color:rgb(225,45,160)">_</span> value: <span style="color:rgb(41,160,159)">Value</span>, to aDictionary: <span style="color:rgb(225,45,160)">inout</span> <span style="color:rgb(41,160,159)">Dictionary</span>, using set: <span style="color:rgb(24,181,177)">Bridge</span>&lt;<span style="color:rgb(41,160,159)">Value</span>, <span style="color:rgb(41,160,159)">Dictionary</span>.<span style="color:rgb(41,160,159)">Value</span>&gt;.<span style="color:rgb(24,181,177)">Setter</span>) {</p>
<p style="margin:0px;font-stretch:normal;font-size:12px;line-height:normal;font-family:Menlo;color:rgb(231,232,235);background-color:rgb(41,43,54)">        aDictionary.<span style="color:rgb(24,181,177)">updateValue</span>(set.<span style="color:rgb(24,181,177)">tr<wbr>ansform</span>(value), forKey: <span style="color:rgb(24,181,177)">key</span>)</p>
<p style="margin:0px;font-stretch:normal;font-size:12px;line-height:normal;font-family:Menlo;color:rgb(231,232,235);background-color:rgb(41,43,54)">    }</p>
<p style="margin:0px;font-stretch:normal;font-size:12px;line-height:normal;font-family:Menlo;color:rgb(231,232,235);background-color:rgb(41,43,54)">}</p>
<p style="margin:0px;font-stretch:normal;font-size:12px;line-height:normal;font-family:Helvetica;background-color:rgb(41,43,54);min-height:14px"><br></p>
<p style="margin:0px;font-stretch:normal;font-size:12px;line-height:normal;font-family:Menlo;color:rgb(231,232,235);background-color:rgb(41,43,54)"><span style="color:rgb(225,45,160)">struct</span> ComplexBond&lt;__Dictionary: <span style="color:rgb(24,181,177)">Bondable</span>, __Value&gt;: <span style="color:rgb(24,181,177)">Bonding</span> {</p>
<p style="margin:0px;font-stretch:normal;font-size:12px;line-height:normal;font-family:Menlo;color:rgb(231,232,235);background-color:rgb(41,43,54)">    <span style="color:rgb(225,45,160)">typealias</span> Dictionary = <span style="color:rgb(24,181,177)">__Dictionary</span></p>
<p style="margin:0px;font-stretch:normal;font-size:12px;line-height:normal;font-family:Menlo;color:rgb(231,232,235);background-color:rgb(41,43,54)">    <span style="color:rgb(225,45,160)">typealias</span> Value = <span style="color:rgb(24,181,177)">__Value</span></p>
<p style="margin:0px;font-stretch:normal;font-size:12px;line-height:normal;font-family:Menlo;color:rgb(231,232,235);background-color:rgb(41,43,54);min-height:14px">    </p>
<p style="margin:0px;font-stretch:normal;font-size:12px;line-height:normal;font-family:Menlo;color:rgb(24,181,177);background-color:rgb(41,43,54)"><span style="color:rgb(231,232,235)">   </span> <span style="color:rgb(225,45,160)">var</span> <span style="color:rgb(231,232,235)">key:</span> __Dictionary<span style="color:rgb(231,232,235)">.</span><span style="color:rgb(41,160,159)">Key</span></p>
<p style="margin:0px;font-stretch:normal;font-size:12px;line-height:normal;font-family:Menlo;color:rgb(231,232,235);background-color:rgb(41,43,54);min-height:14px">    </p>
<p style="margin:0px;font-stretch:normal;font-size:12px;line-height:normal;font-family:Menlo;color:rgb(24,181,177);background-color:rgb(41,43,54)"><span style="color:rgb(231,232,235)">   </span> <span style="color:rgb(225,45,160)">var</span> <span style="color:rgb(231,232,235)">bridge:</span> Bridge<span style="color:rgb(231,232,235)">&lt;</span>__Value<span style="color:rgb(231,232,235)">,</span> __Dictionary<span style="color:rgb(231,232,235)">.</span><span style="color:rgb(41,160,159)">Value</span><span style="color:rgb(231,232,235)">&gt;</span></p>
<p style="margin:0px;font-stretch:normal;font-size:12px;line-height:normal;font-family:Menlo;color:rgb(231,232,235);background-color:rgb(41,43,54)">}</p>
<div><br></div>
<div>The above is an example implementation of the `Bonding` protocol, where the preexisting names of the associated types, `Dictionary` and `Value`, are already appropriately named. It would be great if I could just add a simple keyword prefixing the `typealias` keyword which would enable the inferencing behavior. </div></div></div></blockquote><div><br></div><div>You already don&#39;t need to use a typealias for `Value`. It can already be inferred from the type of `bridge`.</div><div><br></div><div>```</div><div><div>struct ComplexBond&lt;__Dictionary: Bondable, Value&gt;: Bonding {</div><div>  typealias Dictionary = __Dictionary</div><div>  var key: Dictionary.Key</div><div>  var bridge: Bridge&lt;Value, Dictionary.Value&gt;</div><div>}</div></div><div><br></div><div>// This compiles.</div><div>```</div><div><br></div><div>The issue with `Dictionary` and `__Dictionary` is interesting, and here is my analysis:</div><div><br></div><div>The thing is, you don&#39;t actually need `Dictionary` to be a typealias for `__Dictionary` _in order for `ComplexBond` to conform to `Bonding`_ (though you may require this for the semantics of `ComplexBond` itself). For instance, I can instead declare a `ComplexBond2` as follows:</div><div><br></div><div>```</div><div><div>struct ComplexBond2&lt;__Dictionary: Bondable, Value, __AnotherDictionary: Bondable&gt;: Bonding</div><div>where __Dictionary.Key == __AnotherDictionary.Key, __Dictionary.Value == __AnotherDictionary.Value {</div><div>  typealias Dictionary = __AnotherDictionary</div><div>  var key: __Dictionary.Key</div><div>  var bridge: Bridge&lt;Value, __Dictionary.Value&gt;</div><div>}</div></div><div>```</div><div><br></div><div>Put another way, for the purposes of conformance, it only matters that `__Dictionary.Key` is the same type as `Dictionary.Key` and that `__Dictionary.Value` is the same type as `Dictionary.Value`, but `ComplexBond.__Dictionary` and `Bonding.Dictionary` are not required _by the protocol_ to be the same type. Of course, if `ComplexBond` had to implement some protocol requirement by which you could infer that `__Dictionary` must be the same type as `Dictionary`, then that inference would be possible too without a typealias.</div><div><br></div><div>Put another way, the fact that `typealias Dictionary = __Dictionary` is required here is not merely a reflection of some shortcoming in the expressiveness of the language: it reflects the fact that this relationship cannot be inferred because the relationship doesn&#39;t have to be that way--as far as conformance of `ComplexBond` to `Bonding` is concerned. Instead, with that statement, you&#39;re making a _choice_ based on the desired semantics for `ComplexBond`, a choice that is not forced upon you by the protocol to which it conforms. In that sense, it is actually useful that Swift prevents you from naming both `Dictionary` and `__Dictionary` the same thing: you are reminded that the relationship between the two is a choice of the conforming type, not an inevitability of protocol conformance; by contrast, if some requirement *does* make the relationship an inevitability, such a typealias is not required and you *can* name the two with the same name (as is the case with `Value`).</div><div><br></div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex"><div><div name="messageBodySection" style="font-size:14px;font-family:-apple-system,BlinkMacSystemFont,sans-serif">
</div><div><div class="gmail-h5">
<div name="messageReplySection" style="font-size:14px;font-family:-apple-system,BlinkMacSystemFont,sans-serif"><br>
On Jun 23, 2017, 8:36 PM -0400, Xiaodi Wu &lt;<a href="mailto:xiaodi.wu@gmail.com" target="_blank">xiaodi.wu@gmail.com</a>&gt;, wrote:<br>
<blockquote type="cite" style="margin:5px;padding-left:10px;border-left-width:thin;border-left-style:solid;border-left-color:rgb(26,188,156)">Yes, examples will be helpful.<br>
<br>
<br>
<div class="gmail_quote">
<div dir="ltr">On Fri, Jun 23, 2017 at 19:28 David Moore via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a>&gt; wrote:<br></div>
<blockquote class="gmail_quote" style="margin:5px;padding-left:10px;border-left-width:thin;border-left-style:solid;border-left-color:rgb(230,126,34)">
<div dir="auto">I do indeed have quite a few real examples of this, such prompted me to bring this up. I think this could be done without any impact to existing code, but it would require some type of keyword. Take the following as a possible prototype.
<div><br></div>
<div>protocol Foo { </div>
<div>    associatedtype T</div>
<div>}</div>
<div><br></div>
<div>struct Bar&lt;T&gt; : Foo {</div>
<div>    keyword typealias T // Or really any other syntactical implementation.</div>
<div>}</div>
<div><br></div>
<div>With an opt-in method we could implement this without affecting existing code, thereby making this more viable. I will send some examples later.</div>
</div>
<div dir="auto">
<div>
<div><br>
On Jun 23, 2017, at 6:52 PM, Xiaodi Wu &lt;<a href="mailto:xiaodi.wu@gmail.com" target="_blank">xiaodi.wu@gmail.com</a>&gt; wrote:<br>
<br></div>
<blockquote type="cite" style="margin:5px;padding-left:10px;border-left-width:thin;border-left-style:solid;border-left-color:rgb(52,152,219)">
<div>There could be source-breaking implications for such a feature, especially with retroactive conformance. Therefore, I think this could be very tricky and I&#39;d want to be convinced that the benefits are very great to risk such a disturbance. Here, I think the problem is rather mild, and here&#39;s why:<br>
<br>
It is true that, in your example specifically, renaming T to U is the only solution (that I know of, anyway). However, for any &quot;serious&quot; protocol P, there&#39;s likely to be a required property of type P.T, or a function that takes an argument of type P.T or returns a value of type P.T. Therefore, implementing that requirement in Bar with a corresponding property/argument/return value of type Bar.T would generally do the trick.<br>
<br>
Have you got any real-world examples where you&#39;re running into this issue?<br>
<br>
<div class="gmail_quote">
<div dir="ltr">On Fri, Jun 23, 2017 at 17:03 David Moore via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a>&gt; wrote:<br></div>
<blockquote class="gmail_quote" style="margin:5px;padding-left:10px;border-left-width:thin;border-left-style:solid;border-left-color:rgb(211,84,0)">Hello Swift Evolution,<br>
<br>
This may have already been discussed before, but I just came across a bothersome language aspect which reminded me to propose a solution. Currently, if we want to add generics to a protocol the only way to do so is with associated types. I am quite fine with the current approach with respect to those semantics.<br>
<br>
There is, however, a weakness that is built in with using associated types. That weakness is the lack of associated type and generic inference. To be more clear about what I mean, take the following as an example.<br>
<br>
protocol Foo {<br>
    associatedtype T<br>
}<br>
<br>
The foregoing protocol is quite basic, but uses an associated type with the name “T.” Giving the associated type that name will illustrate the dilemma encountered later on down the pipeline.<br>
<br>
struct Bar&lt;T&gt; : Foo {<br>
    // What am I supposed to do? The name is used for both the generic and the type alias Foo needs for conformance.<br>
    typealias T = T // Error!<br>
}<br>
<br>
The above illustrates a situation where we want to connect the generic, which is supposedly named appropriately, and the protocol’s associated type. There is no elegant solution for this at the moment. All I could do is the following.<br>
<br>
struct Bar&lt;U&gt; : Foo {<br>
    typealias T = U // Not nearly as readable.<br>
}<br>
<br>
Now, there may be a few ways to go about adding support for generic inference. The compiler as it is already does some awesome inference get when it comes to generics, so why not take it a step further? I propose the introduction of a keyword, or anything else that could work, to specify explicitly what a given type alias declaration would do when it comes to inferencing. Requiring a keyword would ensure source compatibility remains intact, and it would also make the code more readable.<br>
<br>
I don’t know if this would be something that people could find useful, but I surely would. The implicit mapping of an associated type and a given generic by their names, would be a natural development.<br>
<br>
Let me know if this is just useless, or if could be a potential feature.<br>
<br>
Thank you,<br>
David Moore<br>
______________________________<wbr>_________________<br>
swift-evolution mailing list<br>
<a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a><br>
<a href="https://lists.swift.org/mailman/listinfo/swift-evolution" rel="noreferrer" target="_blank">https://lists.swift.org/<wbr>mailman/listinfo/swift-<wbr>evolution</a><br></blockquote>
</div>
</div>
</blockquote>
</div>
</div>
______________________________<wbr>_________________<br>
swift-evolution mailing list<br>
<a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a><br>
<a href="https://lists.swift.org/mailman/listinfo/swift-evolution" rel="noreferrer" target="_blank">https://lists.swift.org/<wbr>mailman/listinfo/swift-<wbr>evolution</a><br></blockquote>
</div>
</blockquote>
</div>
</div></div></div>

<br>______________________________<wbr>_________________<br>
swift-evolution mailing list<br>
<a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a><br>
<a href="https://lists.swift.org/mailman/listinfo/swift-evolution" rel="noreferrer" target="_blank">https://lists.swift.org/<wbr>mailman/listinfo/swift-<wbr>evolution</a><br>
<br></blockquote></div><br></div></div>