<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 May 20, 2016, at 10:18 AM, Tony Allevato via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org" class="">swift-evolution@swift.org</a>&gt; wrote:</div><br class="Apple-interchange-newline"><div class=""><div dir="ltr" class="">What's the behavior if you have something like this:<div class=""><br class=""></div><div class="">struct Foo&lt;T, U&gt; {</div><div class="">&nbsp; &nbsp; func foo(bar: Any&lt;T, U&gt;) { ... }</div><div class="">}</div><div class="">let f = Foo&lt;A, A&gt;</div><div class=""><br class=""></div><div class="">…?</div></div></div></blockquote><div><br class=""></div><div>We already discussed this topic. &nbsp;You cannot use names dependent on generic arguments in `Any`. &nbsp;This is the same as with `protocol` today. &nbsp;This is because many times it would be invalid (if T was String and U was Int in your example). &nbsp;</div><div><br class=""></div><div>The closest you could get is if the compiler used the constraints on T and U to synthesize a similarly constrained Any. &nbsp;However, I don’t see why you would do that and believe it would be more confusing. &nbsp;If you want an existential with the same constraints as your generic arguments we should do that using the typealias mechanism discussed in the generalized existential proposal.</div><div><br class=""></div><div>typealias Foo = Any&lt;…constraints…&gt;</div><div>typealias Bar = Any&lt;…constraints…&gt;</div><div><br class=""></div><div>struct Foo&lt;T: Foo, U, Bar&gt; {<br class="">&nbsp; &nbsp; func foo(bar: Any&lt;Foo, Bar&gt;) { ... }<br class="">}</div><div><br class=""></div><div>Thorsten’s idea to lowercase `Any` to `any` is a very good one. &nbsp;This makes it clear that `Any` <i class="">does not</i>&nbsp;behave like user-defined generic types (where it *is* possible to use generic arguments as long as they are suitably constrained).</div><br class=""><blockquote type="cite" class=""><div class=""><div dir="ltr" class=""><div class=""><br class=""></div><div class="">More generally, my fear is that being *too* restrictive about banning redundant types could get you into a situation through generic metaprogramming where you might *want* that argument to coalesce to just "A", but if the redundancy check is implemented a certain way, you've just prevented a perhaps legitimate usage with no easy workaround.</div></div></div></blockquote><blockquote type="cite" class=""><div class=""><div dir="ltr" class=""><div class=""><br class=""></div><div class="">I'm inclined to just say: minimize redundant types automatically and if a user wants to write something redundant, that's fine—so a variable declared with type `Any&lt;A, A&gt;` would actually be of type `A`.&nbsp;<span style="line-height:1.5" class="">You might be able to avoid this if you only check the *literal* type or type parameter name going into the Any&lt;&gt;, but I'm not sure how much difficulty that is on the type checking side, and then you'd only catch some of the cases and you'd still have to be able to minimize.</span></div></div></div></blockquote><div><br class=""></div><div>Yes, I have made the same argument. &nbsp;We should not be arbitrarily banning valid, well-defined syntactic constructs for stylistic reasons. &nbsp;They should just be simplified by the compiler such that all syntactic forms are equivalent. &nbsp;</div><div><br class=""></div><div>On the other hand, as you note, if there are implementation reasons for introducing restrictions that is an entirely separate conversation. &nbsp;If we cannot simplify conceptually equivalent syntactic forms such that they have identical behavior that would be a valid reason to consider syntactic restrictions.</div><br class=""><blockquote type="cite" class=""><div class=""><div dir="ltr" class=""><div class=""><br class=""></div></div><br class=""><div class="gmail_quote"><div dir="ltr" class="">On Fri, May 20, 2016 at 7:53 AM Adrian Zubarev via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org" class="">swift-evolution@swift.org</a>&gt; wrote:<br class=""></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div style="word-wrap:break-word" class=""><div style="font-family: Helvetica, Arial; font-size: 13px; margin: 0px;" class="">What I meant here is, that the example should produce an error because it is basically `Any&lt;Any&lt;Any&lt;…&gt;&gt;&gt;` which should be banned. It depends on the context. Using typealias in general can be allowed but it depends how you will use and nest it.</div><div style="font-family: Helvetica, Arial; font-size: 13px; margin: 0px;" class=""><br class=""></div><div style="font-family: Helvetica, Arial; font-size: 13px; margin: 0px;" class="">This example is valid:</div><div style="font-family: Helvetica, Arial; font-size: 13px; margin: 0px;" class=""><br class=""></div><div style="font-family: Helvetica, Arial; font-size: 13px; margin: 0px;" class="">protocol A {} protocol B {} protocol C {}</div><div style="font-family: Helvetica, Arial; font-size: 13px; margin: 0px;" class=""><br class=""></div><div style="font-family: Helvetica, Arial; font-size: 13px; margin: 0px;" class="">typealias AB = Any&lt;A, B&gt;</div><div style="font-family: Helvetica, Arial; font-size: 13px; margin: 0px;" class="">typealias ABC = Any&lt;AB, C&gt;</div><div style="font-family: Helvetica, Arial; font-size: 13px; margin: 0px;" class=""><br class=""></div><div style="font-family: Helvetica, Arial; font-size: 13px; margin: 0px;" class="">If we ban `Any&lt;Any&lt;...&gt;&gt;` one should not abuse `typealias` to achieve that, even if its useless. I’m not sure how hard that would be implement that restriction.</div><div style="font-family: Helvetica, Arial; font-size: 13px; margin: 0px;" class=""><br class=""></div><div style="font-family: Helvetica, Arial; font-size: 13px; margin: 0px;" class="">The example you was pointing at wouldn’t work anyway because the rule #3 and rule #4 should raise an error. Thats how I see it.</div><div style="font-family: Helvetica, Arial; font-size: 13px; margin: 0px;" class=""><br class=""></div><div style="font-family: Helvetica, Arial; font-size: 13px; margin: 0px;" class="">If I’m not correct please provide an example that makes more sense. :)</div></div><div style="word-wrap:break-word" class=""> <br class=""> <div class=""><div style="font-family:helvetica,arial;font-size:13px" class="">--&nbsp;<br class="">Adrian Zubarev<br class="">Sent with Airmail</div></div> <br class=""></div><div style="word-wrap:break-word" class=""><p class="">Am 20. Mai 2016 bei 16:44:35, Matthew Johnson (<a href="mailto:matthew@anandabits.com" target="_blank" class="">matthew@anandabits.com</a>) schrieb:</p> <blockquote type="cite" class=""><span class=""><div dir="auto" class=""><div class=""></div><div class="">









<div class=""><br class="">
<br class="">
Sent from my iPad</div></div></div></span></blockquote></div><div style="word-wrap:break-word" class=""><blockquote type="cite" class=""><span class=""><div dir="auto" class=""><div class="">
<div class=""><br class="">
On May 20, 2016, at 4:39 AM, Adrian Zubarev via swift-evolution
&lt;<a href="mailto:swift-evolution@swift.org" target="_blank" class="">swift-evolution@swift.org</a>&gt;
wrote:<br class="">
<br class=""></div>
<blockquote type="cite" class="">
<div class="">
<div class=""></div>
<div class="">
<div style="font-family: Helvetica, Arial; font-size: 13px; margin: 0px;" class="">
This is a follow up proposal to&nbsp;<a href="https://github.com/apple/swift-evolution/blob/master/proposals/0095-any-as-existential.md" target="_blank" class=""><span style="" class="">SE-0095</span></a>&nbsp;which
should be considered for Swift 3 if SE-0095 will be accepted.</div>
<div style="font-family: Helvetica, Arial; font-size: 13px; margin: 0px;" class="">
<br class=""></div>
<div style="font-family: Helvetica, Arial; font-size: 13px; margin: 0px;" class="">
Here is the formatted draft: <a href="https://github.com/DevAndArtist/swift-evolution/blob/master/proposals/nnnn-ban-redundancy-in-any-existential.md" target="_blank" class="">
https://github.com/DevAndArtist/swift-evolution/blob/master/proposals/nnnn-ban-redundancy-in-any-existential.md</a></div>
<div style="font-family: Helvetica, Arial; font-size: 13px; margin: 0px;" class="">
<br class=""></div>
<div style="font-family: Helvetica, Arial; font-size: 13px; margin: 0px;" class="">
Please provide your feedback in this thread, and don’t make a race
who is making a better proposal on the exact same topic.</div>
<div style="font-family: Helvetica, Arial; font-size: 13px; margin: 0px;" class="">
<br class=""></div>
<div style="font-family: Helvetica, Arial; font-size: 13px; margin: 0px;" class="">
If you spot any types or other mistakes I’d be happy to see you
pointing me to them. ;)</div>
<div style="font-family: Helvetica, Arial; font-size: 13px; margin: 0px;" class="">
<br class=""></div>
<div class="">
<div style="font-family:helvetica,arial;font-size:13px" class="">
--&nbsp;<br class="">
Adrian Zubarev<br class="">
Sent with Airmail</div>
</div>
</div>
<div class="">
<h1 class="">Disallow redundant
<code class="">Any&lt;...&gt;</code> constructs</h1>
<ul class="">
<li class="">Proposal: <a href="https://github.com/apple/swift-evolution/blob/master/proposals/NNNN-name.md" target="_blank" class="">
SE-NNNN</a></li>
<li class="">Author: <a href="https://github.com/DevAndArtist" target="_blank" class="">Adrian
Zubarev</a></li>
<li class="">Status: <a href="x-msg://300/#m_-6273636555714890771_rationale" class="">Awaiting review</a></li>
<li class="">Review manager: TBD</li>
</ul>
<h2 class="">Introduction</h2><p class="">This is a follow up proposal to <a href="https://github.com/apple/swift-evolution/blob/master/proposals/0095-any-as-existential.md" target="_blank" class="">
SE–0095</a>, if it will be accepted for Swift 3. The current
concept of <code class="">Any&lt;...&gt;</code> introduced in SE–0095 will
allow creation of redundant types like <code class="">Any&lt;A&gt; ==
A</code>. I propose to disallow such redundancy in Swift 3 to
prevent breaking changes in a future version of Swift.</p><p class="">Swift-evolution thread: <a class="">[Proposal] Disallow redundant
<code class="">Any&lt;...&gt;</code> constructs</a></p>
<h2 class="">Motivation</h2><p class="">If SE–0095 will be accepted there will be future proposals to
enhance its capabilities. Two of these will be <strong class="">Any-type
requirement</strong> (where <em class="">type</em> could be
<code class="">class</code>, <code class="">struct</code> or <code class="">enum</code>) and
<strong class="">Class requirement</strong>. Without any restrictions these
will introduce more redundancy.</p><p class="">As said before it is possible to create redundant types like
<code class="">Any&lt;A&gt; == A</code> or endless shadowed redundant
nesting:</p>
<pre class=""><code class="">typealias A_1 = Any&lt;A&gt;
typealias A_2 = Any&lt;A_1&gt;
typealias A_3 = Any&lt;A_2&gt;
/* and so on */
</code>
</pre><p class="">This proposal should ban redundancy right from the beginning. If
there might be any desire to relax a few things, it won’t introduce
any breaking changes for <code class="">Any&lt;...&gt;</code>
existential.</p>
</div>
</div>
</blockquote>
</div></div></span></blockquote></div><div style="word-wrap:break-word" class=""><blockquote type="cite" class=""><span class=""><div dir="auto" class=""><div class=""><div class="">Why do you think having multiple typealiases for the same type
is a problem?&nbsp; The whole point of typealias is to
<b class="">alias</b>&nbsp;the name of the type. &nbsp;</div></div></div></span></blockquote></div><div style="word-wrap:break-word" class=""><blockquote type="cite" class=""><span class=""><div dir="auto" class=""><div class="">
<div class=""><br class=""></div>
<br class="">
<blockquote type="cite" class="">
<div class="">
<div class="">
<h2 class="">Proposed solution</h2>
<ol class="">
<li class=""><p class="">If empty <code class="">Any&lt;&gt;</code> won’t be disallowed in
SE–0095, we should disallow nesting empty <code class="">Any&lt;&gt;</code>
inside of <code class="">Any&lt;...&gt;</code>.</p>
</li>
<li class=""><p class="">Disallow nesting <code class="">Any</code> (type refers to current
<code class="">typealias Any = protocol&lt;&gt;</code>) inside of
<code class="">Any&lt;...&gt;</code>.</p>
</li>
<li class=""><p class="">Disallow <code class="">Any&lt;...&gt;</code> containing a single
<code class="">Type</code> like <code class="">Any&lt;Type&gt;</code>.</p><p class="">The first three rules will ban constructs like
<code class="">Any&lt;Any&lt;&gt;, Type&gt;</code> or <code class="">Any&lt;Any,
Type&gt;</code> and force the developer to use <code class="">Type</code>
instead.</p>
</li>
<li class="">Disallow nesting a single <code class="">Any&lt;...&gt;</code> inside
another <code class="">Any&lt;...&gt;</code>.
<ul class="">
<li class="">e.g. <code class="">Any&lt;Any&lt;FirstType,
SecondType&gt;&gt;</code></li>
</ul>
</li>
<li class=""><p class="">Disallow same type usage like <code class="">Any&lt;A, A&gt;</code> or
<code class="">Any&lt;A, B, A&gt;</code> and force the developer to use
<code class="">A</code> or <code class="">Any&lt;A, B&gt;</code> if <code class="">A</code>
and <code class="">B</code> are distinct.</p>
</li>
<li class=""><p class="">Disallow forming redundant types when the provided constraints
are not independent.</p>
<pre class=""><code class="">// Right now `type` can only be `protocol` but in the future Any&lt;...&gt;   
// could also allow `class`, `struct` and `enum`.
// In this example `B` and `C` are distinct.
type A: B, C {}   
      
// all following types are equivalent to `A`
Any&lt;A, Any&lt;B, C&gt;&gt;
Any&lt;Any&lt;A, B&gt;, C&gt;
Any&lt;Any&lt;A, C&gt;, B&gt;
Any&lt;A, B, C&gt;
Any&lt;A, B&gt;
Any&lt;A, C&gt;
</code>
</pre>
<ul class="">
<li class=""><p class="">If all contraints form a known <code class="">Type</code> provide a
<code class="">Fix-it</code> error depending on the current context. If
there is more than one <code class="">Type</code>, provide all alternatives
to the developer.</p>
</li>
<li class=""><p class="">Using <code class="">Any&lt;...&gt;</code> in a generic context might not
produce a <code class="">Fix-it</code> error:</p>
<pre class=""><code class="">protocol A {}
protocol B {}
protocol C: A, B {}
          
// there is no need for `Fix-it` in such a context
func foo&lt;T: Any&lt;A, B&gt;&gt;(value: T) {}
</code>
</pre></li>
</ul>
</li>
</ol>
<h2 class="">Impact on existing code</h2><p class="">These changes will break existing code. Projects abusing
<code class="">Any&lt;...&gt;</code> to create redundant types should be
reconsidered of usings the equivalent <code class="">Type</code> the
compiler would infer. One would be forced to use <code class="">A</code>
instead of <code class="">Any&lt;A&gt;</code> for example. A
<code class="">Fix-it</code> error message can help the developer to migrate
his project.</p>
<h2 class="">Alternatives considered</h2>
<ul class="">
<li class="">Leave redundancy as-is for Swift 3 and live with it.</li>
<li class="">Deprecate redundancy in a future version of Swift, which will
introduce breaking changes.</li>
</ul>
</div>
</div>
</blockquote>
<blockquote type="cite" class="">
<div class="">
<span class="">_______________________________________________</span><br class="">
<span class="">swift-evolution mailing list</span><br class="">
<span class=""><a href="mailto:swift-evolution@swift.org" target="_blank" class="">swift-evolution@swift.org</a></span><br class="">

<span class=""><a href="https://lists.swift.org/mailman/listinfo/swift-evolution" target="_blank" class="">https://lists.swift.org/mailman/listinfo/swift-evolution</a></span><br class="">
</div>
</blockquote>


</div></div></span></blockquote></div>_______________________________________________<br class="">
swift-evolution mailing list<br class="">
<a href="mailto:swift-evolution@swift.org" target="_blank" class="">swift-evolution@swift.org</a><br class="">
<a href="https://lists.swift.org/mailman/listinfo/swift-evolution" rel="noreferrer" target="_blank" class="">https://lists.swift.org/mailman/listinfo/swift-evolution</a><br class="">
</blockquote></div>
_______________________________________________<br class="">swift-evolution mailing list<br class=""><a href="mailto:swift-evolution@swift.org" class="">swift-evolution@swift.org</a><br class="">https://lists.swift.org/mailman/listinfo/swift-evolution<br class=""></div></blockquote></div><br class=""></body></html>