<div dir="ltr">It&#39;s probably appropriate. Given that, in this example, Bar implicitly unifies its generic constraint T with Foo&#39;s associatedtype T (or, typealiases T with T), you need to be at least a little careful how you name your generic constraints.<div><br></div><div>protocol Foo</div><div>{</div><div>    associatedtype T</div><div>}</div><div><br></div><div>struct&lt;T&gt; Bar : Foo</div><div>{</div><div>}</div></div><div class="gmail_extra"><br><div class="gmail_quote">On Thu, Apr 7, 2016 at 12:52 AM, Erica Sadun 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 style="word-wrap:break-word"><br><div><div><div class="h5"><blockquote type="cite"><div>On Apr 6, 2016, at 5:45 PM, David Waite via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a>&gt; wrote:</div><br><div><div style="word-wrap:break-word"><div><br><div><blockquote type="cite"><div>On Apr 6, 2016, at 1:36 PM, Joe Groff via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a>&gt; wrote:</div><div><br style="font-family:Helvetica;font-size:12px;font-style:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px"><span style="font-family:Helvetica;font-size:12px;font-style:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;float:none;display:inline!important">I think this is a good idea, though I would put the `where` clause after the function signature:</span><br style="font-family:Helvetica;font-size:12px;font-style:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px"><br style="font-family:Helvetica;font-size:12px;font-style:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px"><span style="font-family:Helvetica;font-size:12px;font-style:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;float:none;display:inline!important">func foo&lt;T: Foo, U: Bar&gt;(x: T, y: U) -&gt; Result&lt;T,U&gt;</span><br style="font-family:Helvetica;font-size:12px;font-style:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px"><span style="font-family:Helvetica;font-size:12px;font-style:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;float:none;display:inline!important">   where T.Foo == U.Bar /*, etc. */</span><br style="font-family:Helvetica;font-size:12px;font-style:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px"><span style="font-family:Helvetica;font-size:12px;font-style:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;float:none;display:inline!important">{</span><br style="font-family:Helvetica;font-size:12px;font-style:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px"><span style="font-family:Helvetica;font-size:12px;font-style:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;float:none;display:inline!important">}</span><br style="font-family:Helvetica;font-size:12px;font-style:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px"></div></blockquote><div><br></div><div>A bit of a meta-argument:</div><div><br></div>It is very common to use single-capital letter generic parameters, and the API style does not give guidance around the naming of generic parameters.</div><div><br></div><div>However in my humble-but-opinionated view, they are effectively scope-bound, dynamic type aliases. Declaring func &quot;foo&lt;T&gt;&quot; is like declaring “var i”, but its forgiven since coming up with a good, concise name for such a type alias can be hard.</div><div><br></div><div>The standard library seems inconsistent about this as well:</div><div><br></div><div>func == &lt;A : Equatable, B : Equatable&gt;(_: (A, B), rhs: (A, B))</div><div><br></div><div>vs.</div><div><br></div><div>func == &lt;Key : Equatable, Value : Equatable&gt;(_: [Key : Value], rhs: [Key : Value])</div><div><br></div><div>The argument I bring up is that naming of the generic parameters may wind up affecting whether the code is clearer having type constraints and the where clause within the brackets or trailing the function. It is important to take this into account and compare both apples to apples and oranges to oranges when evaluating syntax.</div><div><br></div><div>(or, change the API guide and standard library to discourage either apples or oranges)</div><div><br></div><div>-DW</div></div></div></div></blockquote><div><br></div></div></div>I&#39;ll keep this short. IMO:</div><div><br></div><div>* Dictionaries have semantics, so Key/Value makes sense.</div><div>* Truly &quot;generic&quot; equatable values do not, so A and B are simple stand-ins.</div><div>* Always prefer named tokens when there are actual semantics (Element, Wrapped, etc). </div><div><br></div><div>This may or may not be appropriate for inclusion in the API guidelines.</div><span class="HOEnZb"><font color="#888888"><div><br></div><div>-- E</div><div><br></div><br></font></span></div><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>
<br></blockquote></div><br></div>