<html><head><meta http-equiv="Content-Type" content="text/html charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><br class=""><div><blockquote type="cite" class=""><div class="">On Jan 3, 2016, at 10:44 PM, Matthew Johnson &lt;<a href="mailto:matthew@anandabits.com" class="">matthew@anandabits.com</a>&gt; wrote:</div><br class="Apple-interchange-newline"><div class=""><meta http-equiv="Content-Type" content="text/html charset=utf-8" class=""><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><br class=""><div class=""><blockquote type="cite" class=""><div class="">On Jan 3, 2016, at 9:14 PM, Drew Crawford &lt;<a href="mailto:drew@sealedabstract.com" class="">drew@sealedabstract.com</a>&gt; wrote:</div><br class="Apple-interchange-newline"><div class=""><meta http-equiv="Content-Type" content="text/html charset=us-ascii" class=""><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class="">Sure, here's the start of the thread:&nbsp;<a href="https://lists.swift.org/pipermail/swift-evolution/Week-of-Mon-20151207/001856.html" class="">https://lists.swift.org/pipermail/swift-evolution/Week-of-Mon-20151207/001856.html</a></div></div></blockquote><div class=""><br class=""></div>Thanks. &nbsp;Joe was basically saying is that associated types would be automatically bound to the existential for their constraints, or Any if there are no constraints. &nbsp;</div><div class=""><br class=""></div><div class="">He didn’t specifically mention anything about Self, but I suppose Self requirements could also be automatically bound to Any if the existential type doesn’t specify anything more specific, although I’m not sure I would like that behavior.</div><div class=""><br class=""></div><div class="">Self is what would apply in the case of:</div><div class=""><br class=""></div><div class=""><blockquote type="cite" class=""><div class="highlight highlight-source-swift" style="box-sizing: border-box; margin-bottom: 16px; 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; background-color: rgb(255, 255, 255);"><pre class="" style="box-sizing: border-box; overflow: auto; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 14px; margin-top: 0px; margin-bottom: 0px; line-height: 1.45; padding: 16px; background-color: rgb(247, 247, 247); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; word-wrap: normal; word-break: normal;"><span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">func</span> <span class="pl-en" style="box-sizing: border-box; color: rgb(121, 93, 163);">compareTwo</span>(first: <span class="pl-c1" style="box-sizing: border-box; color: rgb(0, 134, 179);">Comparable</span>, _ <span class="pl-smi" style="box-sizing: border-box;">second</span>: <span class="pl-c1" style="box-sizing: border-box; color: rgb(0, 134, 179);">Comparable</span>) <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">-&gt;</span> <span class="pl-c1" style="box-sizing: border-box; color: rgb(0, 134, 179);">Int</span> {  <span class="pl-c" style="box-sizing: border-box; color: rgb(150, 152, 150);">// error!</span>
  <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">if</span> first <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">&lt;</span> second {
    <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">return</span> <span class="pl-c1" style="box-sizing: border-box; color: rgb(0, 134, 179);">-1</span>
  }
  <span class="pl-c" style="box-sizing: border-box; color: rgb(150, 152, 150);">//...</span>
}</pre></div></blockquote><div class="">If Self were automatically bound to Any what would this do? &nbsp;Would it compile and invoke a `&lt;` operator that takes two Any parameters? &nbsp;That doesn’t seem to make sense to me. &nbsp;It certainly wouldn’t guarantee you get the correct behavior if first and second were both Int for example.</div></div></div></div></blockquote><div><br class=""></div><div>I gave this some further thought last night and realized what would happen here is pretty clear. &nbsp;I hadn’t considered existentials where associated types aren’t bound to concrete types before so it just took a few minutes to work through.</div><div><br class=""></div><div>Existentials reference a witness table pointing to an actual implementations of the protocol requirements. &nbsp;Actual implementations require parameters of concrete types. &nbsp;This means that you must know what that concrete type is and supply a value of that type in order to actually call the member. &nbsp;The implication of this is that members which require parameters of an associated type that is not bound to a concrete type will not be available on that existential. &nbsp;</div><div><br class=""></div><div>In this example, `&lt;` requires two arguments of type Self. &nbsp;However, the `Comparable` existential, if allowed, would have Self bound to `Any`, not a concrete type. &nbsp;Therefore `&lt;` would not be available and you would receive a compiler error on that line. &nbsp;It would be different than the current error and on a different line of code but it would still fail to compile.</div><div><br class=""></div><div>With return types, you do not necessarily need to know the concrete type returned by the implementation. &nbsp;Swift could theoretically box the result itself into an existential and return that to the caller. &nbsp;I do not know whether this is the actual design that will be implemented or not.</div><div><br class=""></div><div>If I any of the above details are incorrect I hope Joe or someone else will correct me. &nbsp;:)</div><div><br class=""></div><div>Matthew</div><br class=""><blockquote type="cite" class=""><div class=""><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><div class=""><br class=""></div><div class=""><br class=""><blockquote type="cite" class=""><div class=""><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><div class=""><br class=""></div><div class=""><br class=""><div class=""><blockquote type="cite" class=""><div class="">On Jan 3, 2016, at 9:10 PM, Matthew Johnson &lt;<a href="mailto:matthew@anandabits.com" class="">matthew@anandabits.com</a>&gt; wrote:</div><br class="Apple-interchange-newline"><div class=""><div class=""><br class=""><blockquote type="cite" class="">On Jan 3, 2016, at 9:08 PM, Drew Crawford &lt;<a href="mailto:drew@sealedabstract.com" class="">drew@sealedabstract.com</a>&gt; wrote:<br class=""><br class=""><blockquote type="cite" class="">Existentials for protocols with Self and / or associated type requirements would require bindings for Self and / or the associated type(s). &nbsp;At least when you use a member that contains Self and / or an associated type in its signature. &nbsp;So the previous example will always fail to compile. <br class=""></blockquote><br class="">Not true. &nbsp;Joe Groff:<br class=""></blockquote><br class="">Can you point me to the source? &nbsp;I would like more context around these comments.<br class=""><br class=""><blockquote type="cite" class=""><br class=""><blockquote type="cite" class="">This seems like it would be addressed just by allowing Factory to be used as a dynamic type, with its Product type generalized to Any. We'll be set up to support that with some runtime work to store associated types in protocol witness tables (which is also necessary to fix cyclic conformances, one of our Swift 3 goals).<br class=""></blockquote><br class=""><br class=""><blockquote type="cite" class="">Yeah, when generalizing a protocol type, we ought to be able to either generalize the associated types to their upper bounds, for use cases like yours, or constrain them to specific types, for the AnyGenerator&lt;T&gt; kind of case.<br class=""></blockquote></blockquote><br class=""></div></div></blockquote></div><br class=""></div></div></div></blockquote></div><br class=""></div></div></blockquote></div><br class=""></body></html>