<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 Nov 27, 2017, at 12:50 PM, Douglas Gregor &lt;<a href="mailto:dgregor@apple.com" class="">dgregor@apple.com</a>&gt; wrote:</div><br class="Apple-interchange-newline"><div class=""><meta http-equiv="Content-Type" content="text/html; charset=utf-8" class=""><div style="word-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;" class=""><div dir="auto" style="word-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;" class=""><br class=""><div class=""><br class=""><blockquote type="cite" class=""><div class="">On Nov 24, 2017, at 3:11 PM, Matthew Johnson 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=""><meta http-equiv="Content-Type" content="text/html charset=utf-8" class=""><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><div class="">As mentioned in my prior message, I currently have a PR open to update the generics manifesto (<a href="https://github.com/apple/swift/pull/13012" class="">https://github.com/apple/swift/pull/13012</a>). &nbsp;I removed one topic from that update at Doug Gregor’s request that it be discussed on the list first. &nbsp;</div><div class=""><br class=""></div><div class="">The idea is to add the ability to make default arguments conditional (i.e. depend on generic constraints). &nbsp;It is currently possible to emulate conditional default arguments using an overload set. &nbsp;This is verbose, especially when several arguments are involved. &nbsp;Here is an example use case using the overload method to emulate this feature:</div><div class=""><br class=""></div><div class="">```swift</div><div class="">protocol Resource {</div><div class="">&nbsp; associatedtype Configuration</div><div class="">&nbsp; associatedtype Action</div><div class="">}</div><div class="">struct ResourceDescription&lt;R: Resource&gt; {</div><div class="">&nbsp; func makeResource(with configuration: R.Configuration, actionHandler: @escaping (R.Action) -&gt; Void) -&gt; R {</div><div class="">&nbsp; &nbsp; // create a resource using the provided configuration</div><div class="">&nbsp; &nbsp; // connect the action handler</div><div class="">&nbsp; &nbsp; // return the resource</div><div class="">&nbsp; }</div><div class="">}</div><div class=""><br class=""></div><div class="">extension ResourceDescription where R.Configuration == Void {</div><div class="">&nbsp; func makeResource(actionHandler: @escaping (R.Action) -&gt; Void) -&gt; R {</div><div class="">&nbsp; &nbsp; return makeResource(with: (), actionHandler: actionHandler)</div><div class="">&nbsp; }</div><div class="">}</div><div class=""><br class=""></div><div class="">extension ResourceDescription where R.Action == Never {</div><div class="">&nbsp; func makeResource(with configuration: R.Configuration) -&gt; R {</div><div class="">&nbsp; &nbsp; return makeResource(with: configuration, actionHandler: { _ in })</div><div class="">&nbsp; }</div><div class="">}</div><div class=""><br class=""></div><div class="">extension ResourceDescription where R.Configuration == Void, R.Action == Never {</div><div class="">&nbsp; func makeResource() -&gt; R {</div><div class="">&nbsp; &nbsp; return makeResource(with: (), actionHandler: { _ in })</div><div class="">&nbsp; }</div><div class="">}</div><div class=""><br class=""></div><div class="">```</div><div class=""><br class=""></div><div class="">Adding language support for defining these more directly would eliminate a lot of boilerplate and reduce the need for overloads. </div></div></div></blockquote><div class=""><br class=""></div><div class="">If one could refer to `self` in a default argument (which is not a big problem), you could turn the default into a requirement itself… although it doesn’t *quite* work with your example as written because it would always need to be implemented somehow:</div><div class=""><br class=""></div><div class=""><blockquote type="cite" class=""><div class="" style="word-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;"><div class="">protocol Resource {</div><div class="">&nbsp; associatedtype Configuration</div><div class="">&nbsp; associatedtype Action</div></div></blockquote>&nbsp; &nbsp; func defaultConfiguration() -&gt; Configuration</div><div class="">&nbsp; &nbsp; func defaultHandler() -&gt; ((R.Action) -&gt; Void)<br class=""><blockquote type="cite" class=""><div class="" style="word-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;"><div class="">}</div></div></blockquote></div></div></div></div></div></blockquote><div><br class=""></div><div>This won’t work on its own for this use case because there is only a valid default in relatively narrow (but common) cases. &nbsp;For most values of Configuration and Action an argument must be provided by the caller. &nbsp;Xiaodi’s proposed syntax is the best fit (so far) for the use case I had in mind. &nbsp;</div><div><br class=""></div><div>That said, the ability to refer to self in default arguments is complementary as it would expand the cases where conditional default arguments could be provided. &nbsp;For example, in the example above it would allow a resource to provide a nontrivial default configuration.</div><br class=""><blockquote type="cite" class=""><div class=""><div style="word-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;" class=""><div dir="auto" style="word-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;" class=""><div class=""><div class=""><br class=""></div><blockquote type="cite" class=""><div class=""><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><div class="">&nbsp;Doug mentioned that it may also help simplify associated type inference (<a href="https://github.com/apple/swift/pull/13012#discussion_r152124535" class="">https://github.com/apple/swift/pull/13012#discussion_r152124535</a>).</div></div></div></blockquote><br class=""></div><div class="">Oh, I thought this was something related to choosing a defaults for associated types, which might have helped with my current associated-type-inference quandary. The topic you actually wanted to discuss is disjoint (sorry).</div></div></div></div></blockquote><div><br class=""></div><div>I was wondering how it was related and wondered if it was somehow due to reduction in the size of the overload set. &nbsp;If you have any ideas on changes that might help guide the inference algorithm somehow please start a new thread. &nbsp;Even if you’re only able to describe the challenges it might be worth a thread if it’s possible others might have useful ideas. &nbsp;Improving the reliability and predictability of inference is a very important topic!</div><br class=""><blockquote type="cite" class=""><div class=""><div style="word-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;" class=""><div dir="auto" style="word-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;" class=""><div class=""><br class=""></div><div class=""><span class="Apple-tab-span" style="white-space:pre">        </span>- Doug</div><div class=""><br class=""></div><br class=""></div></div></div></blockquote></div><br class=""></body></html>