<div dir="ltr">It&#39;s not possible, even with Swift&#39;s current implementation of existentials. A protocol type P isn&#39;t considered to conform to itself, thus the following is rejected:<div><br></div><div><div>let a : MyProtocol = // ...</div><div>func myFunc&lt;T : MyProtocol&gt;(x: T) {</div><div>  // ....</div><div>}</div><div>myFunc(a) // &quot;Cannot invoke &#39;myFunc&#39; with an argument list of type MyProtocol&quot;</div></div><div><br></div><div>Changing how this works is probably worth a proposal by itself.</div><div><br></div><div>Austin</div><div><br></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Jun 8, 2016 at 12:34 PM, Thorsten Seitz 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><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="HOEnZb"><div class="h5"><br>
&gt; Am 08.06.2016 um 20:33 schrieb Dave Abrahams via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a>&gt;:<br>
&gt;<br>
&gt;<br>
&gt; on Tue Jun 07 2016, Matthew Johnson &lt;matthew-AT-anandabits.com&gt; wrote:<br>
&gt;<br>
&gt;&gt;&gt; On Jun 7, 2016, at 9:15 PM, Dave Abrahams &lt;<a href="mailto:dabrahams@apple.com">dabrahams@apple.com</a>&gt; wrote:<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; on Tue Jun 07 2016, Matthew Johnson &lt;matthew-AT-anandabits.com &lt;<a href="http://matthew-at-anandabits.com/" rel="noreferrer" target="_blank">http://matthew-at-anandabits.com/</a>&gt;&gt; wrote:<br>
&gt;&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt; On Jun 7, 2016, at 4:13 PM, Dave Abrahams via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a>&gt; wrote:<br>
&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt; on Tue Jun 07 2016, Matthew Johnson &lt;<a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a>&gt; wrote:<br>
&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt;&gt;&gt; , but haven&#39;t realized<br>
&gt;&gt;&gt;&gt;&gt;&gt;&gt; that if you step around the type relationships encoded in Self<br>
&gt;&gt;&gt;&gt;&gt;&gt;&gt; requirements and associated types you end up with types that appear to<br>
&gt;&gt;&gt;&gt;&gt;&gt;&gt; interoperate but in fact trap at runtime unless used in exactly the<br>
&gt;&gt;&gt;&gt;&gt;&gt;&gt; right way.<br>
&gt;&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt;&gt; Trap at runtime?  How so?  Generalized existentials should still be<br>
&gt;&gt;&gt;&gt;&gt;&gt; type-safe.<br>
&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt; There are two choices when you erase static type relationships:<br>
&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt; 1. Acheive type-safety by trapping at runtime<br>
&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt; FloatingPoint(3.0 as Float) + FloatingPoint(3.0 as Double) // trap<br>
&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt; 2. Don&#39;t expose protocol requirements that involve these relationships,<br>
&gt;&gt;&gt;&gt;&gt; which would prevent the code above from compiling and prevent<br>
&gt;&gt;&gt;&gt;&gt; FloatingPoint from conforming to itself.<br>
&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt;&gt; Or are you talking about the hypothetical types / behaviors people<br>
&gt;&gt;&gt;&gt;&gt;&gt; think they want when they don’t fully understand what is happening...<br>
&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt; I don&#39;t know what you mean here.  I think generalized existentials will<br>
&gt;&gt;&gt;&gt;&gt; be nice to have, but I think most people will want them to do something<br>
&gt;&gt;&gt;&gt;&gt; they can&#39;t possibly do.<br>
&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt; Exactly.  What I meant is that people think they want that expression<br>
&gt;&gt;&gt;&gt; to compile because they don’t understand that the only thing it can do<br>
&gt;&gt;&gt;&gt; is trap.  I said “hypothetical” because producing a compile time error<br>
&gt;&gt;&gt;&gt; rather than a runtime trap is the only sane thing to do.  Your comment<br>
&gt;&gt;&gt;&gt; surprised me because I can’t imagine we would move forward in Swift<br>
&gt;&gt;&gt;&gt; with the approach of trapping.<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; I would very much like to be able to create instances of “Collection<br>
&gt;&gt;&gt; where Element == Int” so we can throw away the wrappers in the stdlib.<br>
&gt;&gt;&gt; That will require some type mismatches to be caught at runtime via<br>
&gt;&gt;&gt; trapping.<br>
&gt;&gt;<br>
&gt;&gt; For invalid index because the existential accepts a type erased index?<br>
&gt;<br>
&gt; Exactly.<br>
&gt;<br>
&gt;&gt; How do you decide where to draw the line here?  It feels like a very<br>
&gt;&gt; slippery slope for a language where safety is a stated priority to<br>
&gt;&gt; start adopting a strategy of runtime trapping for something as<br>
&gt;&gt; fundamental as how you expose members on an existential.<br>
&gt;<br>
&gt; If you don&#39;t do this, the alternative is that “Collection where Element<br>
&gt; == Int” does not conform to Collection.  That&#39;s weird and not very<br>
&gt; useful.  You could expose all the methods that were on protocol<br>
&gt; extensions of Collection on this existential, unless they used<br>
&gt; associated types other than the element type.  But you couldn&#39;t pass the<br>
&gt; existential to a generic function like<br>
&gt;<br>
&gt;   func scrambled&lt;C: Collection&gt;(_ c: C) -&gt; [C.Element]<br>
<br>
</div></div>I don’t understand. Why couldn’t an existential be passed to that function?<br>
<br>
-Thorsten<br>
<div class="HOEnZb"><div class="h5"><br>
<br>
<br>
&gt;<br>
&gt;&gt; IMO you should *have* to introduce unsafe behavior like that manually.<br>
&gt;<br>
&gt;  Collection where Element == Int &amp; Index == *<br>
&gt;<br>
&gt; ?<br>
&gt;<br>
&gt;&gt; Collection indices are already something that isn’t fully statically<br>
&gt;&gt; safe so I understand why you might want to allow this.<br>
&gt;<br>
&gt; By the same measure, so are Ints :-)<br>
&gt;<br>
&gt; The fact that a type&#39;s methods have preconditions does *not* make it<br>
&gt; “statically unsafe.”<br>
&gt;<br>
&gt;&gt; But I don’t think having the language&#39;s existentials do this<br>
&gt;&gt; automatically is the right approach.  Maybe there is another approach<br>
&gt;&gt; that could be used in targeted use cases where the less safe behavior<br>
&gt;&gt; makes sense and is carefully designed.<br>
&gt;<br>
&gt; Whether it makes sense or not really depends on the use-cases.  There&#39;s<br>
&gt; little point in generalizing existentials if the result isn&#39;t very useful.<br>
&gt; The way to find out is to take a look at the examples we currently have<br>
&gt; of protocols with associated types or Self requirements and consider<br>
&gt; what you&#39;d be able to do with their existentials if type relationships<br>
&gt; couldn&#39;t be erased.<br>
&gt;<br>
&gt; We have known use-cases, currently emulated in the standard library, for<br>
&gt; existentials with erased type relationships.  *If* these represent the<br>
&gt; predominant use cases for something like generalized existentials, it<br>
&gt; seems to me that the language feature should support that.  Note: I have<br>
&gt; not seen anyone build an emulation of the other kind of generalized<br>
&gt; existential.  My theory: there&#39;s a good reason for that :-).<br>
&gt;<br>
&gt; --<br>
&gt; Dave<br>
&gt; _______________________________________________<br>
&gt; swift-evolution mailing list<br>
&gt; <a href="mailto:swift-evolution@swift.org">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">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></blockquote></div><br></div>