<div dir="ltr">I suppose &quot;a.Element&quot; could be considered a path-dependent type.<div><br></div><div>My inclination is to disallow the use of &quot;a.AssociatedType&quot; if &#39;a&#39; is a generic type like T inside func&lt;T&gt;(a: T) or class&lt;T&gt;, and only allow it if &#39;a&#39; is an existential. This goes back to the notion that existential types and generic types (universal types?) are two different concepts that are closely related. Allowing the use of that notation would be an additive change, so if necessary it could be expressed in a followup proposal (and we could hash out all the semantics then).</div><div><div><br></div><div>Austin</div><div><br></div></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Thu, May 26, 2016 at 10:52 AM, Thorsten Seitz <span dir="ltr">&lt;<a href="mailto:tseitz42@icloud.com" target="_blank">tseitz42@icloud.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div style="word-wrap:break-word"><br><div><span class=""><blockquote type="cite"><div>Am 26.05.2016 um 07:53 schrieb Austin Zheng via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a>&gt;:</div><br><div><div dir="ltr">The inimitable Joe Groff provided me with an outline as to how the design could be improved. I&#39;ve taken the liberty of rewriting parts of the proposal to account for his advice.<div><br></div><div>It turns out the runtime type system is considerably more powerful than I expected. The previous concept in which protocols with associated types&#39; APIs were vended out selectively and using existentials has been discarded.</div><div><br></div><div>Instead, all the associated types that belong to an existential are accessible as &#39;anonymous&#39; types within the scope of the existential. These anonymous types are not existentials - they are an anonymous representation of whatever concrete type is satisfying the existential&#39;s value&#39;s underlying type&#39;s associated type.</div><div><br></div></div></div></blockquote><div><br></div></span><pre style="font-family:Consolas,&#39;Liberation Mono&#39;,Menlo,Courier,monospace;font-size:14px;margin-top:0px;margin-bottom:0px;line-height:1.45;word-wrap:normal;padding:16px;overflow:auto;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-break:normal;color:rgb(51,51,51)"><span style="color:rgb(167,29,93)">let</span> a <span style="color:rgb(167,29,93)">:</span> <span style="color:rgb(0,134,179)">Any</span><span style="color:rgb(167,29,93)">&lt;</span>Collection<span style="color:rgb(167,29,93)">&gt;</span>
</pre><pre style="font-family:Consolas,&#39;Liberation Mono&#39;,Menlo,Courier,monospace;font-size:14px;margin-top:0px;margin-bottom:0px;line-height:1.45;word-wrap:normal;padding:16px;overflow:auto;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-break:normal;color:rgb(51,51,51)"><span style="color:rgb(150,152,150)">// A variable whose type is the Element associated type of the underlying</span>
<span style="color:rgb(150,152,150)">// concrete type of &#39;a&#39;.</span>
<span style="color:rgb(167,29,93)">let</span> theElement <span style="color:rgb(167,29,93)">:</span> a<span style="color:rgb(167,29,93)">.</span>Element <span style="color:rgb(167,29,93)">=</span> <span style="color:rgb(167,29,93)">...</span></pre><div><br></div><div>In Scala this would be a „path dependent type“ which actually depends on the variable `a`.</div><div>What would happen in the following case:</div><div><br></div><div>func foo&lt;T: Any&lt;Collection&gt;&gt;(a: T, b: T) {</div><div><span style="white-space:pre-wrap">        </span>// is the type of a.Element equal to the type of b.Element here? (In Scala it would not) </div><div>}</div><span class="HOEnZb"><font color="#888888"><div><br></div><div><br></div><div>-Thorsten</div><div><br></div><div><br></div><div><br></div></font></span><blockquote type="cite"><div><span class=""><div dir="ltr"><div>This is an enormous step up in power - for example, an existential can return a value of one of these anonymous associated types from one function and pass it into another function that takes the same type, maintaining perfect type safety but without ever revealing the actual type. There is no need anymore to limit the APIs exposed to the user, although there may still exist APIs that are semantically useless without additional type information.</div><div><br></div><div>A set of conversions has also been defined. At compile-time &#39;as&#39; can be used to turn values of these anonymous associated types back into existentials based on the constraints defined earlier. &#39;as?&#39; can also be used for conditional casting of these anonymously-typed values into potential actual types.</div><div><br></div><div>As always, the link is here, and feedback would be greatly appreciated: <a href="https://github.com/austinzheng/swift-evolution/blob/az-existentials/proposals/XXXX-enhanced-existentials.md" target="_blank">https://github.com/austinzheng/swift-evolution/blob/az-existentials/proposals/XXXX-enhanced-existentials.md</a></div><div><br></div><div>Best,</div><div>Austin</div></div></span><div class="gmail_extra"><br><div class="gmail_quote"><span class="">On Tue, May 24, 2016 at 5:09 AM, Matthew Johnson 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></span><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span class=""><br>
<br>
Sent from my iPad<br>
<span><br>
On May 23, 2016, at 9:52 PM, Brent Royal-Gordon via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a>&gt; wrote:<br>
<br>
&gt;&gt; One initial bit of feedback -  I believe if you have existential types, I believe you can define Sequence Element directly, rather than with a type alias. e.g.<br>
&gt;&gt;<br>
&gt;&gt; protocol Sequence {<br>
&gt;&gt;  associatedtype Element<br>
&gt;&gt;  associatedtype Iterator: any&lt;IteratorProtocol where IteratorProtocol.Element==Element&gt;<br>
&gt;&gt;  associatedtype SubSequence: any&lt;Sequence where Sequence.Element == Element&gt;<br>
&gt;&gt;  …<br>
&gt;&gt; }<br>
&gt;<br>
&gt; That&#39;s not really the same thing. Any&lt;IteratorProtocol&gt; is an existential, not a protocol. It&#39;s basically an automatically-generated version of our current `AnyIterator&lt;T&gt;` type (though with some additional flexibility). It can&#39;t appear on the right side of a `:`, any more than AnyIterator could.<br>
<br>
</span>After this proposal you should be able to use these existentials anywhere you can place a constraint, so it would work.  You can do this with the protocol composition operator today and the future existential is just an extension of that capability.<br>
<span><br>
&gt;<br>
&gt; What *would* work is allowing `where` clauses on associated types:<br>
&gt;<br>
&gt;&gt; protocol Sequence {<br>
&gt;&gt;  associatedtype Element<br>
&gt;&gt;  associatedtype Iterator: IteratorProtocol where Iterator.Element==Element<br>
&gt;&gt;  associatedtype SubSequence: Sequence where SubSequence.Element == Element<br>
&gt;&gt;  …<br>
&gt;&gt; }<br>
&gt;<br>
&gt; I believe this is part of the generics manifesto.<br>
&gt;<br>
&gt; --<br>
&gt; Brent Royal-Gordon<br>
&gt; Architechies<br>
&gt;<br>
</span></span><span class=""><div><div>&gt; _______________________________________________<br>
&gt; swift-evolution mailing list<br>
&gt; <a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a><br>
&gt; <a href="https://lists.swift.org/mailman/listinfo/swift-evolution" rel="noreferrer" target="_blank">https://lists.swift.org/mailman/listinfo/swift-evolution</a><br>
<br>
_______________________________________________<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/mailman/listinfo/swift-evolution</a><br>
</div></div></span></blockquote></div><br></div><span class="">
_______________________________________________<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" target="_blank">https://lists.swift.org/mailman/listinfo/swift-evolution</a><br></span></div></blockquote></div><br></div></blockquote></div><br></div>