<html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"></head><body dir="auto"><div>My only reservation would be the choice of <b>WHERE</b> which I would have kept for more *dynamic* situations int the language. My first choice for this would have been <b><u>WITH</u></b> which in my minds carries a more permanent, intemporal connotation in my mind. But that is off topic for this discussion.</div><div><br>On May 14, 2016, at 9:43 PM, Pyry Jahkola via swift-evolution <<a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a>> wrote:<br><br></div><blockquote type="cite"><div><meta http-equiv="Content-Type" content="text/html charset=utf-8"><div class="">Tony & Haravikk,</div><div class=""><br class=""></div><div class="">(Reformatting your quoted examples just a bit…)</div><br class=""><div><blockquote type="cite" class=""><blockquote type="cite" class="">It enables things like:<br class=""><font face="Menlo" style="font-size: 11px;" class=""> <b class="">func</b> someMethod<S : SequenceType, T>(value: S) -> AnySequence<T><br class=""> <b class="">where</b> S.Generator.Element == T { ... }</font><br class=""></blockquote><br class="">I'm not assuming that. Under the current syntax, I would format your example as:<br class=""><br class=""><font face="Menlo" style="font-size: 11px;" class=""> <b class="">func</b> someMethod<<br class=""> S : SequenceType, T<br class=""> <b class="">where</b> S.Generator.Element == T<br class=""> >(value: S) -> AnySequence<T> {<br class=""> ...<br class=""> }</font><br class=""></blockquote></div><br class=""><div class="">You are both right here, but please note that the proposal still also allows moving <b class="">all</b> constraints to the `<font face="Menlo" class=""><span style="font-size: 11px;" class=""><b class="">where</b></span></font>` clause:</div><div class=""><br class=""></div><div class=""><font face="Menlo" style="font-size: 11px;" class=""> <b class="">func</b> someMethod<S, T>(value: S) -> AnySequence<T></font></div><div class=""><font face="Menlo" style="font-size: 11px;" class=""> <b class="">where</b> S : SequenceType,</font></div><div class=""><font face="Menlo" style="font-size: 11px;" class=""> S.Generator.Element == T</font></div><div class=""><font face="Menlo" style="font-size: 11px;" class=""> {</font></div><div class=""><font face="Menlo" style="font-size: 11px;" class=""> ...</font></div><div class=""><font face="Menlo" style="font-size: 11px;" class=""> }</font></div><div class=""><br class=""></div><div class="">just like Swift 2 allows doing so within the `<font face="Menlo" class=""><span style="font-size: 11px;" class=""><...></span></font>` brackets:</div><div class=""><br class=""></div><div class=""><div class=""><font face="Menlo" style="font-size: 11px;" class=""> <b class="">func</b> someMethod<S, T<br class=""> <b class="">where</b> S : SequenceType, S.Generator.Element == T</font></div><div class=""><font face="Menlo" class=""><span style="font-size: 11px;" class=""> >(value: S) -> AnySequence<T> {<br class=""> ...<br class=""> }</span><br class=""></font></div></div><div class=""><br class=""></div><div class="">The reason I'd recommend that style for anything but simple constraints is because:</div><div class=""><br class=""></div><div class="">1) It makes the call site `<font face="Menlo" class=""><span style="font-size: 11px;" class=""><b class="">let</b> items = someMethod(value: things)</span></font>` lightest to visually match to the declaration, because the only thing between the function name and its argument list is the `<font face="Menlo" class=""><span style="font-size: 11px;" class=""><...></span></font>` bracketed list of introduced generic types which you'll expect to see in the function signature and constraints.</div><div class=""><br class=""></div><div class="">2) In general, the `<font face="Menlo" class=""><span style="font-size: 11px;" class=""><b class="">where</b></span></font>` constraints really apply to the whole function/type declaration, not just a single generic parameter.</div><div class=""><br class=""></div><div class="">3) It was claimed that all constraints should go right next to the introduction of the generic parameters. But that isn't the whole case because Swift also applies <i class="">implicit</i> constraints onto any generic parameters that are used in constrained positions. If that wasn't clearly said, take the following example in Swift 2.x:</div><div class=""><br class=""></div><div class=""><font face="Menlo" class=""><span style="font-size: 11px;" class=""> <b class="">func</b> aMethod<S : SequenceType, T <b class="">where</b> S.Generator.Element == T>(value: S) -> Set<T> {</span></font></div><div class=""><font face="Menlo" class=""><span style="font-size: 11px;" class=""> <b class="">return</b> Set(value)</span></font></div><div class=""><font face="Menlo" class=""><span style="font-size: 11px;" class=""> }</span></font></div><div class=""><br class=""></div><div class="">That declaration actually makes you wait all the way until the return type `<font face="Menlo" class=""><span style="font-size: 11px;" class="">Set<T></span></font>` until you learn that `<font face="Menlo" style="font-size: 11px;" class="">T</font>` must also necessarily be `<font face="Menlo" style="font-size: 11px;" class="">Hashable</font>`. So I don't see how it's that different if the `<font face="Menlo" class=""><span style="font-size: 11px;" class=""><b class="">where</b></span></font>` clause isn't right next to the generic type arguments' introduction:</div><div class=""><br class=""></div><div class=""><div class=""><font face="Menlo" class=""><span style="font-size: 11px;" class=""> <b class="">func</b> </span></font><span style="font-family: Menlo; font-size: 11px;" class="">aMethod</span><font face="Menlo" class=""><span style="font-size: 11px;" class=""><S, T>(value: S) -> Set<T> <font color="#919191" class="">// FWIW, this line contains what I usually have in mind when browsing code.</font></span></font></div><div class=""><font face="Menlo" class=""><span style="font-size: 11px;" class=""> <b class="">where</b> <font color="#919191" class="">// T : Hashable, // (implicit)</font></span></font></div><div class=""><font face="Menlo" class=""><span style="font-size: 11px;" class=""> S</span></font><span style="font-family: Menlo; font-size: 11px;" class=""> : SequenceType,</span></div><div class=""><span style="font-family: Menlo; font-size: 11px;" class=""> S.Generator.Element == T</span></div><div class=""><font face="Menlo" class=""><span style="font-size: 11px;" class=""> {</span></font></div><div class=""><font face="Menlo" class=""><span style="font-size: 11px;" class=""> <b class="">return</b> Set(value)</span></font></div><div class=""><font face="Menlo" class=""><span style="font-size: 11px;" class=""> }</span></font></div></div><div class=""><br class=""></div><div class="">— Pyry</div><div class=""><br class=""></div><div class="">PS. Besides, neither the original example nor mine was really fair; you don't need `<font face="Menlo" class=""><span style="font-size: 11px;" class=""><b class="">where</b></span></font>` for these. Instead, you'd just write:</div><div class=""><br class=""></div><div class=""><font face="Menlo" class=""><span style="font-size: 11px;" class=""> <b class="">func</b> someMethod<S : SequenceType>(value: S) -> AnySequence<S.Generator.Element> {</span></font></div><div class=""><font face="Menlo" class=""><span style="font-size: 11px;" class=""> ...</span></font></div><div class=""><font face="Menlo" class=""><span style="font-size: 11px;" class=""> }</span></font></div><div class=""><br class=""></div><div class="">which SE-0081 has nothing to argue for or against.</div><div class=""><br class=""></div></div></blockquote><blockquote type="cite"><div><span>_______________________________________________</span><br><span>swift-evolution mailing list</span><br><span><a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a></span><br><span><a href="https://lists.swift.org/mailman/listinfo/swift-evolution">https://lists.swift.org/mailman/listinfo/swift-evolution</a></span><br></div></blockquote></body></html>