<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="">On Dec 25, 2016, at 12:54 PM, Adam Nemecek via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org" class="">swift-evolution@swift.org</a>&gt; wrote:<div><blockquote type="cite" class=""><div class=""><div dir="ltr" class="">Does enabling a lot of small improvements that make APIs more ergonomic count as practical?</div></div></blockquote><div><br class=""></div><div>Yes, that would count as practical, but&nbsp;Xiaodi’s question is just as important. &nbsp;*Which* APIs become more ergonomic?</div><div><br class=""></div><div>Here are a couple of more questions:</div><div><br class=""></div><div>1) How does this square with Swift’s general philosophy to not default initialize values to “zero”?</div><div><br class=""></div><div>2) To your original example, it isn’t immediately clear to me that reduce should choose a default identity. &nbsp;Some types (e.g. integers and FP) belong to multiple different ring algebras, and therefore have different identity values that correspond to the relevant binary operations.</div><div><br class=""></div><div>-Chris</div><br class=""><blockquote type="cite" class=""><div class=""><div class="gmail_extra"><br class=""><div class="gmail_quote">On Sun, Dec 25, 2016 at 12:19 PM, Xiaodi Wu <span dir="ltr" class="">&lt;<a href="mailto:xiaodi.wu@gmail.com" target="_blank" class="">xiaodi.wu@gmail.com</a>&gt;</span> wrote:<br class=""><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr" class=""><span class="">On Sun, Dec 25, 2016 at 3:07 PM, Adam Nemecek <span dir="ltr" class="">&lt;<a href="mailto:adamnemecek@gmail.com" target="_blank" class="">adamnemecek@gmail.com</a>&gt;</span> wrote:<br class=""></span><div class="gmail_extra"><div class="gmail_quote"><span class=""><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr" class="">There's a book that provides quite a bit of info on this&nbsp;<div class=""><br class=""></div><div class=""><a href="https://smile.amazon.com/Elements-Programming-Alexander-Stepanov/dp/032163537X?sa-no-redirect=1" target="_blank" class="">https://smile.amazon.com/Eleme<wbr class="">nts-Programming-Alexander-<wbr class="">Stepanov/dp/032163537X?sa-no-<wbr class="">redirect=1</a><br class=""></div><div class=""><br class=""></div><div class="">They say that DefaultConstructible is one of the essential protocols on which most algorithms rely in one way or another. One of the authors is the designer of the C++ STL and basically the father of modern generics.</div><div class=""><br class=""></div><div class="">This protocol is important for any algebraic structure that deals with the concept of appending or addition (as "zero" is one of the requirements of monoid). There isn't a good short answer to your question. It's a building block of algorithms. Think about why a RangeReplaceableCollection can provide you with a default constructor but a Collection can't.&nbsp;</div><div class=""><span style="color:rgb(80,0,80)" class=""></span></div></div></blockquote><div class=""><br class=""></div></span><div class="">It's well and fine that most algorithms rely on the concept in one way or another. Yet the Swift standard library already implements many generic algorithms but has no DefaultConstructible, presumably because there are other protocols that guarantee `init()` and the algorithms being implemented don't need to be (practically speaking) generic over all DefaultConstructible types. My question is: what practical use cases are there for an explicit DefaultConstructible that are impractical today?</div><span class=""><div class=""><br class=""></div><div class=""><br class=""></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr" class=""><div class=""><span style="color:rgb(80,0,80)" class="">On Sun, Dec 25, 2016 at 11:37 AM, Xiaodi Wu </span><span dir="ltr" style="color:rgb(80,0,80)" class="">&lt;<a href="mailto:xiaodi.wu@gmail.com" target="_blank" class="">xiaodi.wu@gmail.com</a>&gt;</span><span style="color:rgb(80,0,80)" class=""> wrote:</span><br class=""></div></div><div class="m_8912025549324475289HOEnZb"><div class="m_8912025549324475289h5"><div class="gmail_extra"><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Can you give some other examples of generic algorithms that would make use of this DefaultConstructible? I'm having trouble coming up with any other than reduce.<br class=""><div class="gmail_quote"><div class=""><div class="m_8912025549324475289m_699475458640075951h5"><div dir="ltr" class="">On Sun, Dec 25, 2016 at 14:23 Adam Nemecek via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org" target="_blank" class="">swift-evolution@swift.org</a>&gt; wrote:<br class=""></div></div></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class=""><div class="m_8912025549324475289m_699475458640075951h5"><div dir="ltr" class="m_8912025549324475289m_699475458640075951m_-6015751673947924360gmail_msg">This protocol is present in C++&nbsp;<a href="http://en.cppreference.com/w/cpp/concept/DefaultConstructible" class="m_8912025549324475289m_699475458640075951m_-6015751673947924360gmail_msg" target="_blank">http://en.cppreference.com<wbr class="">/w/cpp/concept/DefaultConstruc<wbr class="">tible</a> as well as in Rust <a href="https://doc.rust-lang.org/std/default/" class="m_8912025549324475289m_699475458640075951m_-6015751673947924360gmail_msg" target="_blank">https://doc.rust-lang.org/std/<wbr class="">default/</a><div class="m_8912025549324475289m_699475458640075951m_-6015751673947924360gmail_msg"><br class="m_8912025549324475289m_699475458640075951m_-6015751673947924360gmail_msg"></div><div class="m_8912025549324475289m_699475458640075951m_-6015751673947924360gmail_msg">It's the identity element/unit of a monoid or a zero.<br class="m_8912025549324475289m_699475458640075951m_-6015751673947924360gmail_msg"><div class="m_8912025549324475289m_699475458640075951m_-6015751673947924360gmail_msg"><br class="m_8912025549324475289m_699475458640075951m_-6015751673947924360gmail_msg"></div><div class="m_8912025549324475289m_699475458640075951m_-6015751673947924360gmail_msg"><div class="m_8912025549324475289m_699475458640075951m_-6015751673947924360gmail_msg">The Swift implementation is very simple (I'm open to different names)<br class="m_8912025549324475289m_699475458640075951m_-6015751673947924360gmail_msg"></div><div class="m_8912025549324475289m_699475458640075951m_-6015751673947924360gmail_msg"><br class="m_8912025549324475289m_699475458640075951m_-6015751673947924360gmail_msg"></div><div class="m_8912025549324475289m_699475458640075951m_-6015751673947924360gmail_msg">protocol DefaultConstructible {</div><div class="m_8912025549324475289m_699475458640075951m_-6015751673947924360gmail_msg">&nbsp; &nbsp; init()&nbsp;</div><div class="m_8912025549324475289m_699475458640075951m_-6015751673947924360gmail_msg">}</div><div class="m_8912025549324475289m_699475458640075951m_-6015751673947924360gmail_msg"><br class="m_8912025549324475289m_699475458640075951m_-6015751673947924360gmail_msg"></div><div class="m_8912025549324475289m_699475458640075951m_-6015751673947924360gmail_msg">A lot of the standard types could then be made to conform to this protocol. These include all the numeric types, collection types (array, set, dict), string, basically at least every type that currently has a constructor without any arguments.</div><div class="m_8912025549324475289m_699475458640075951m_-6015751673947924360gmail_msg"><br class="m_8912025549324475289m_699475458640075951m_-6015751673947924360gmail_msg"></div><div class="m_8912025549324475289m_699475458640075951m_-6015751673947924360gmail_msg">The RangeReplaceableCollection protocol would inherit from this protocol as well.&nbsp;<br class="m_8912025549324475289m_699475458640075951m_-6015751673947924360gmail_msg"></div><div class="m_8912025549324475289m_699475458640075951m_-6015751673947924360gmail_msg"><br class="m_8912025549324475289m_699475458640075951m_-6015751673947924360gmail_msg"></div><div class="m_8912025549324475289m_699475458640075951m_-6015751673947924360gmail_msg">This protocol would simplify a lot of generic algorithms where you need the concept of a zero (which shows up a lot)</div></div><div class="m_8912025549324475289m_699475458640075951m_-6015751673947924360gmail_msg"><br class="m_8912025549324475289m_699475458640075951m_-6015751673947924360gmail_msg"></div><div class="m_8912025549324475289m_699475458640075951m_-6015751673947924360gmail_msg">Once introduced, Sequence could define an alternative implementation of reduce where the initial result doesn't need to be provided as it can be default constructed.</div><div class="m_8912025549324475289m_699475458640075951m_-6015751673947924360gmail_msg"><br class="m_8912025549324475289m_699475458640075951m_-6015751673947924360gmail_msg"></div><div class="m_8912025549324475289m_699475458640075951m_-6015751673947924360gmail_msg"><br class="m_8912025549324475289m_699475458640075951m_-6015751673947924360gmail_msg"></div><div class="m_8912025549324475289m_699475458640075951m_-6015751673947924360gmail_msg"><br class="m_8912025549324475289m_699475458640075951m_-6015751673947924360gmail_msg"></div><div class="m_8912025549324475289m_699475458640075951m_-6015751673947924360gmail_msg"><br class="m_8912025549324475289m_699475458640075951m_-6015751673947924360gmail_msg"></div><div class="m_8912025549324475289m_699475458640075951m_-6015751673947924360gmail_msg"><br class="m_8912025549324475289m_699475458640075951m_-6015751673947924360gmail_msg"></div></div></div></div></div>
______________________________<wbr class="">_________________<br class="m_8912025549324475289m_699475458640075951m_-6015751673947924360gmail_msg">
swift-evolution mailing list<br class="m_8912025549324475289m_699475458640075951m_-6015751673947924360gmail_msg">
<a href="mailto:swift-evolution@swift.org" class="m_8912025549324475289m_699475458640075951m_-6015751673947924360gmail_msg" target="_blank">swift-evolution@swift.org</a><br class="m_8912025549324475289m_699475458640075951m_-6015751673947924360gmail_msg">
<a href="https://lists.swift.org/mailman/listinfo/swift-evolution" rel="noreferrer" class="m_8912025549324475289m_699475458640075951m_-6015751673947924360gmail_msg" target="_blank">https://lists.swift.org/mailma<wbr class="">n/listinfo/swift-evolution</a><br class="m_8912025549324475289m_699475458640075951m_-6015751673947924360gmail_msg">
</blockquote></div>
</blockquote></div><br class=""></div>
</div></div></blockquote></span></div><br class=""></div></div>
</blockquote></div><br class=""></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>