<div dir="ltr">On Mon, Dec 26, 2016 at 12:50 AM, Daniel Leping <span dir="ltr">&lt;<a href="mailto:daniel@crossroadlabs.xyz" target="_blank">daniel@crossroadlabs.xyz</a>&gt;</span> wrote:<br><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"><div>I&#39;m not arguing for implicit conformance in general, but I&#39;m telling that DefaultConstructable is the same basic level as AnyObject, which is conformed implicitly.</div><div><br></div><div>Shortly, I&#39;m against implicit conformance in general. I&#39;m positive with &quot;automatic compiler magic&quot; conformance to DefaultConstructable for any object having a default constructor as it really is a very basic stuff. Otherwise you will have to add explicit conformance to it in almost every class of yours (annoying).</div></blockquote><div><br></div><div>Well, this sounds very different from Adam&#39;s proposal, where he proposes semantic meaning for `init()` that, as he described, means that it cannot apply to every type that implements `init()`. However, he also just said that he thinks that all types with `init()` should conform, so I guess I&#39;m confused which way that is.</div><div><br></div><div>At base, you want a way of knowing if a type has `init()`. That sounds like reflection to me, not protocol conformance. For the record, I look forward to the day when AnyObject magic is removed; I assume it is coming eventually.</div><div><br></div><div><br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="HOEnZb"><div class="h5"><div><div class="gmail_quote"><div>On Mon, 26 Dec 2016 at 11:14 Xiaodi Wu &lt;<a href="mailto:xiaodi.wu@gmail.com" target="_blank">xiaodi.wu@gmail.com</a>&gt; wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="m_-7316109184252281435gmail_msg">On Mon, Dec 26, 2016 at 12:43 AM, Daniel Leping via swift-evolution <span class="m_-7316109184252281435gmail_msg">&lt;<a href="mailto:swift-evolution@swift.org" class="m_-7316109184252281435gmail_msg" target="_blank">swift-evolution@swift.org</a>&gt;</span> wrote:<br class="m_-7316109184252281435gmail_msg"><div class="gmail_extra m_-7316109184252281435gmail_msg"><div class="gmail_quote m_-7316109184252281435gmail_msg"><blockquote class="gmail_quote m_-7316109184252281435gmail_msg" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="m_-7316109184252281435gmail_msg">Thank you, Adam!</div></blockquote><div class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"></div><div class="m_-7316109184252281435gmail_msg">Wait, are you arguing for implicit conformance or not?</div></div></div></div><div class="m_-7316109184252281435gmail_msg"><div class="gmail_extra m_-7316109184252281435gmail_msg"><div class="gmail_quote m_-7316109184252281435gmail_msg"><div class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"></div><blockquote class="gmail_quote m_-7316109184252281435gmail_msg" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="m_-7316109184252281435m_-6624483711025557005HOEnZb m_-7316109184252281435gmail_msg"><div class="m_-7316109184252281435m_-6624483711025557005h5 m_-7316109184252281435gmail_msg"><div class="m_-7316109184252281435gmail_msg"><div class="gmail_quote m_-7316109184252281435gmail_msg"><div class="m_-7316109184252281435gmail_msg">On Mon, 26 Dec 2016 at 11:12 Adam Nemecek via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org" class="m_-7316109184252281435gmail_msg" target="_blank">swift-evolution@swift.org</a>&gt; wrote:<br class="m_-7316109184252281435gmail_msg"></div><blockquote class="gmail_quote m_-7316109184252281435gmail_msg" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg">&gt; <span style="font-size:12.8px" class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg">Swift doesn&#39;t do implicit conformance.  It always has to be declared</span><br style="font-size:12.8px" class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><span style="font-size:12.8px" class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg">explicitly.  I&#39;m pretty sure Doug Gregor can explain why better than I</span><br style="font-size:12.8px" class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><span style="font-size:12.8px" class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg">could.</span><div class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><span style="font-size:12.8px" class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"></span></div><div class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><span style="font-size:12.8px" class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"></span></div></div><div class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><div class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><span style="font-size:12.8px" class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg">I don&#39;t think Daniel was arguing for implicit conformance, he&#39;s saying that if it makes sense for an object to have a default constructor, it makes sense for it to conform to the protocol which I agree with 100%.</span></div></div><div class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><div class="gmail_extra m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><div class="gmail_quote m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg">On Sun, Dec 25, 2016 at 9:17 PM, Dave Abrahams via swift-evolution <span class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg">&lt;<a href="mailto:swift-evolution@swift.org" class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg" target="_blank">swift-evolution@swift.org</a>&gt;</span> wrote:<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><blockquote class="gmail_quote m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">on Sun Dec 25 2016, Daniel Leping &lt;<a href="mailto:swift-evolution@swift.org" class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg" target="_blank">swift-evolution@swift.org</a>&gt; wrote:<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt; You are right, usually it&#39;s required to implement a protocol which is not a<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt; good approach. The best is plain objects which can be used independently of<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt; ORM if needed (as DTOs, i.e.).<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt; I was thinking of DefaultConstructable as a protocol automatically applied<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt; to any class/struct having a default init, which is really logical for<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt; me.<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"></span>Swift doesn&#39;t do implicit conformance.  It always has to be declared<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">explicitly.  I&#39;m pretty sure Doug Gregor can explain why better than I<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">could.<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><div class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><div class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374m_2766821119499066179m_-4530764108705073068h5 m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt; On Mon, 26 Dec 2016 at 9:41 Xiaodi Wu &lt;<a href="mailto:xiaodi.wu@gmail.com" class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg" target="_blank">xiaodi.wu@gmail.com</a>&gt; wrote:<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; On Sun, Dec 25, 2016 at 10:50 PM, Daniel Leping<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; &lt;<a href="mailto:daniel@crossroadlabs.xyz" class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg" target="_blank">daniel@crossroadlabs.xyz</a>&gt;<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; wrote:<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt;<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; Ok, an example from ORM. You have an entity factory with a virtual (read,<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; overloadable in the subclasses) method populating the properties.<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; DefaultConstructable is a great choice here. Otherwise you will have to<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; force the users of your ORM to implement a certain protocol, which you most<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; probably would like to avoid.<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt;<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt;<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; Sorry--I&#39;m not very familiar with using Swift for ORM purposes. Why do you<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; want to avoid having your users conform to a certain protocol? Wouldn&#39;t the<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; users of your ORM have to conform to `DefaultConstructible` then? I&#39;m<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; looking at Swift ORMs, and all require users to conform to a protocol or<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; inherit from a base class, typically named `Model` or similar. From a quick<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; Google search:<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt;<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; <a href="https://vapor.github.io/documentation/fluent/model.html" rel="noreferrer" class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg" target="_blank">https://vapor.github.io/<wbr>documentation/fluent/model.<wbr>html</a><br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; <a href="https://github.com/blitzagency/amigo-swift" rel="noreferrer" class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg" target="_blank">https://github.com/<wbr>blitzagency/amigo-swift</a><br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt;<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt;<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; In general I think the best showcase is generic factories.<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt;<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; On Mon, 26 Dec 2016 at 9:02 Xiaodi Wu &lt;<a href="mailto:xiaodi.wu@gmail.com" class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg" target="_blank">xiaodi.wu@gmail.com</a>&gt; wrote:<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt;<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; On Sun, Dec 25, 2016 at 10:18 PM, Daniel Leping<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; &lt;<a href="mailto:daniel@crossroadlabs.xyz" class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg" target="_blank">daniel@crossroadlabs.xyz</a>&gt;<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; wrote:<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt;<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; Usually it&#39;s a generic function that needs to return a value from some<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; other function or a default value (zero) in a case of some conditions.<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; Optional value is an arguable solution in quite some scenarios. Afaik,<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; sometimes it can be used for optional resolution.<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt;<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt;<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; Right, I&#39;d agree that Optional is the idiomatic way to do it. Afaict,<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; there&#39;s not much you can do with a default value that you couldn&#39;t with<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; nil, unless you have some guarantee as to _what_ that default is; however,<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; I&#39;d expect that in every case that you can rely on a guarantee about a<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; default value which would be more useful than nil, it&#39;s going to require<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; more specific knowledge of your type than an all-encompassing<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; `DefaultConstructible` can provide.<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt;<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; Also, generic factories. Widely used in ORM solutions.<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt;<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt;<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; Can you elaborate on this? Why is Optional not a solution here?<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt;<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt;<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; As mentioned above, algorythmical stuff that requires Zero.<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt;<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt;<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; I&#39;m still not convinced there exist credible use cases that need to be<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; generic over both collections and floating point, for instance. In fact, in<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; my experience, there are few math-heavy algorithms where one can ignore<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; even the distinction between integers and binary floating point. By the<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; time you get down to matrix math, you start to run into difficulties that<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; require separate implementations for Float and Double.<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt;<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; On Mon, 26 Dec 2016 at 8:38 Xiaodi Wu &lt;<a href="mailto:xiaodi.wu@gmail.com" class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg" target="_blank">xiaodi.wu@gmail.com</a>&gt; wrote:<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt;<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; Can you give some examples of what you used this approach to do?<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt;<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt;<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; On Sun, Dec 25, 2016 at 9:49 PM, Daniel Leping<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; &lt;<a href="mailto:daniel@crossroadlabs.xyz" class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg" target="_blank">daniel@crossroadlabs.xyz</a>&gt;<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; wrote:<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt;<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; +1 to this approach. I remember I had to create it on my own for my<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; projects. Would be nice to have it out of the box.<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt;<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; On Mon, 26 Dec 2016 at 8:11 Adam Nemecek via swift-evolution &lt;<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; <a href="mailto:swift-evolution@swift.org" class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg" target="_blank">swift-evolution@swift.org</a>&gt; wrote:<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt;<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; &gt; Yes, those particular types have initializers that take no arguments.<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; That does not address my question. You merely restated your initial<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; observation that many types in Swift have implemented `init()`.<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt;<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; Right, it&#39;s an empirical argument.<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt;<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; &gt; I didn&#39;t think the value returned by `init()` was regarded as any sort<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; of zero--or even any sort of &quot;default.&quot; In fact, some types in Foundation<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; have a static property called `default` distinct from `init()`.<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt;<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; Let&#39;s not talk about those then. This would not apply to every single type<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; in existence, as I&#39;ve stated previously.<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt;<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; &gt; It gives you something different every time. How can this be squared<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; with your stated motivation regarding concepts of zero and concepts of<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; equality?<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt;<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; Due to the fact that it&#39;s a resource, not a value. As I&#39;ve stated above,<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; not all of this applies to types that are more resource-like.<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt;<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; &gt; Or, it&#39;s what you get because that&#39;s the most trivial possible string.<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; Quite simply, I do not think the designer of most types that implement<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; `init()` have paused to wonder whether the value that you get is the<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; identity element associated with the most useful and prominent operation<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; that can be performed on that type. I certainly never have.<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt;<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; This is an appeal to tradition.<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt;<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; &gt; The statement I wrote was in JavaScript, so I&#39;m not sure what you mean<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; by returning an optional. `[].reduce((a, b) =&gt; a + b)` results in an<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; error in JavaScript. In Swift, such a function may also be implemented with<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; a precondition that the array is not empty and would not return an optional.<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt;<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; I was talking about their analogous swift implementations.<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt;<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; &gt; Can you give an example of an algorithm dealing with tensors where you<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; would use a `DefaultConstructible` generic over all types that have<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; `init()`, as opposed to working with the existing `Integer`,<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; `FloatingPoint`, and other numerical protocols?<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt;<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; If it&#39;s implemented as either nested collections or numbers.<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt;<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt;<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt;<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; On Sun, Dec 25, 2016 at 6:00 PM, Xiaodi Wu &lt;<a href="mailto:xiaodi.wu@gmail.com" class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg" target="_blank">xiaodi.wu@gmail.com</a>&gt; wrote:<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt;<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; On Sun, Dec 25, 2016 at 7:30 PM, Adam Nemecek &lt;<a href="mailto:adamnemecek@gmail.com" class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg" target="_blank">adamnemecek@gmail.com</a>&gt;<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; wrote:<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt;<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; &gt;  Is it well settled, either in Swift or in C++/Rust/etc., that the value<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; returned by a default initializer/constructor is regarded as an identity<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; element or zero?<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt;<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; Int() == 0, String() == &quot;&quot; so to some extent by convention, a lot of types<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; have a default value as is.<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt;<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt;<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; Yes, those particular types have initializers that take no arguments. That<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; does not address my question. You merely restated your initial observation<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; that many types in Swift have implemented `init()`.<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt;<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; I didn&#39;t think the value returned by `init()` was regarded as any sort of<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; zero--or even any sort of &quot;default.&quot; In fact, some types in Foundation have<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; a static property called `default` distinct from `init()`. In Rust, the<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; Default trait requires a function called `default()`, which is documented<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; as being useful when you want &quot;some kind of default value, and don&#39;t<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; particularly care what it is.&quot;<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt;<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; I was asking whether there&#39;s some understanding, of which I&#39;ve been<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; unaware, that the result of `init()` (or the equivalent in other languages)<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; is expected to be some sort of zero or an identity element. I&#39;m not aware<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; of any evidence to that effect. Are you?<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt;<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; &gt; Is the thread that I get by writing `let t = Thread()` some kind of zero<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; in any reasonable sense of the word?<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt;<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; DefaultConstructibility makes less sense for types that represent some<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; sort of resource but make sense for things that are values. But even in<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; this case, Thread() gives you a default value for example if you are<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; working with a resizable collection of threads.<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt;<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt;<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; It gives you something different every time. How can this be squared with<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; your stated motivation regarding concepts of zero and concepts of equality?<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt;<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; A better question is why does thread currently implement a default<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; constructor?<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt;<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt;<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; It&#39;s an initializer that takes no arguments, because none are needed for a<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; new thread. How else would you write it?<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt;<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; &gt; Do you mean to argue that for an integer the additive identity should be<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; considered &quot;more prominent and useful&quot; than the multiplicative identity?<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; I&#39;m not aware of any mathematical justification for such a conclusion.<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt;<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; I do. The justification is that if I call the default constructor of Int<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; currently, I get the value of 0.<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt;<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt;<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; This is backwards. Why do you believe that the value you obtain from<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; `init()` is intended to be an identity element at all, let alone the most<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; important one? (It&#39;s also circular reasoning. Since `init()` only ever<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; gives you one value at a time, by your reasoning it demonstrates that every<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; type must have one &quot;more prominent and useful&quot; identity, which is begging<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; the question.)<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt;<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; Which means that the binary operation must be addition.<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt;<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt;<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; Based on the value of `Int.init()`, you conclude that addition of integers<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; is a &quot;more prominent and useful&quot; operation than multiplication? Again, this<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; is backwards. Rather, we know that each numerical type belongs to multiple<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; ring algebras; there is no basis for reckoning any as &quot;more useful.&quot; Since<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; `init()` can only ever give us one value at a time, we know that `init()`<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; cannot give a value that is a meaningful default with respect to any<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; particular operation.<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt;<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; If I call String() I get &quot;&quot; which is the identity of the + String<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; operation.<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt;<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt;<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; Or, it&#39;s what you get because that&#39;s the most trivial possible string.<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; Quite simply, I do not think the designer of most types that implement<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; `init()` have paused to wonder whether the value that you get is the<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; identity element associated with the most useful and prominent operation<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; that can be performed on that type. I certainly never have.<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt;<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; &gt; Going to your original example, I should add: other languages provide a<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; version of `reduce` that doesn&#39;t require an initial result (for instance,<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; JavaScript). In JavaScript, `[1, 2, 3].reduce((a, b) =&gt; a + b)` uses the<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; element at array index 0 as the initial result, and the accumulator<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; function is invoked starting with the element at array index 1. This is<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; precisely equivalent to having `reduce` use the additive identity as the<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; default initial result when + is the accumulator function and the<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; multiplicative identity when * is the accumulator function (with the<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; accumulator function being invoked starting with the element at array index<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; 0). It does not require a DefaultConstructible protocol. What more<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; ergonomic solution could be implemented using a monoidic wrapper type?<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt;<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; These two will have different signatures. The reduce you describe returns<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; an optional,<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt;<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt;<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; The statement I wrote was in JavaScript, so I&#39;m not sure what you mean by<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; returning an optional. `[].reduce((a, b) =&gt; a + b)` results in an error<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; in JavaScript. In Swift, such a function may also be implemented with a<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; precondition that the array is not empty and would not return an optional.<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt;<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; the other one would returns the default value.<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt;<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt;<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; In what scenario would you prefer to propagate a default after reducing a<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; potential empty collection _without supplying an explicit default_ for that<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; operation? This would certainly violate the Swift convention of not<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; defaulting to zero and, I suspect, most users of Swift would not regard<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; that as ergonomic at all.<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt;<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt;<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; Fundamentally the default constructibles are useful in numerical<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; computations e..g. dealing with tensors.<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt;<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt;<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; Can you give an example of an algorithm dealing with tensors where you<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; would use a `DefaultConstructible` generic over all types that have<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; `init()`, as opposed to working with the existing `Integer`,<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; `FloatingPoint`, and other numerical protocols? (I should also add, FWIW, I<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; have never seen a generic algorithm written for integers or FP types that<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; has preferred the use of `T()` over `0`.)<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt;<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt;<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; On Sun, Dec 25, 2016 at 3:30 PM, Xiaodi Wu &lt;<a href="mailto:xiaodi.wu@gmail.com" class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg" target="_blank">xiaodi.wu@gmail.com</a>&gt; wrote:<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt;<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"></div></div><span class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg">&gt;&gt; On Sun, Dec 25, 2016 at 5:27 PM, Adam Nemecek &lt;<a href="mailto:adamnemecek@gmail.com" class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg" target="_blank">adamnemecek@gmail.com</a>&gt;<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; wrote:<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt;<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; &gt; *Which* APIs become more ergonomic?<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt;<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; I&#39;ll get back to this question in a second if I may. This would be a<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; longer discussion and I first want to make sure that before we get into the<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; details that there is a possibility of this being introduced (I&#39;m asking if<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; violating the no zero defaults is more important than slightly more<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; ergonomic APIs). But to give a broad answer I think that the concept of a<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; zero is closely related to the concept of equality (and all the things that<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; build up on equality such as comparability and negation).<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt;<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; &gt; 1) How does this square with Swift’s general philosophy to not default<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; initialize values to “zero”?<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt;<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; I actually wasn&#39;t aware of this philosophy. Despite this philosophy, look<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; at how many types actually currently implement a default constructor.<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt;<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt;<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"></span>&gt;&gt; (Not a rhetorical question:) Is it well settled, either in Swift or in<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><span class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg">&gt;&gt; C++/Rust/etc., that the value returned by a default initializer/constructor<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"></span>&gt;&gt; is regarded as an identity element or zero? Is the thread that I get by<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><span class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374m_2766821119499066179m_-4530764108705073068im m_-7316109184252281435m_-6624483711025557005m_2849072433074184374m_2766821119499066179m_-4530764108705073068HOEnZb m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg">&gt;&gt; writing `let t = Thread()` some kind of zero in any reasonable sense of the<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; word?<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt;<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt;<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"></span><span class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374m_2766821119499066179m_-4530764108705073068im m_-7316109184252281435m_-6624483711025557005m_2849072433074184374m_2766821119499066179m_-4530764108705073068HOEnZb m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg">&gt;&gt; Also can I ask what&#39;s the motivation behind this philosophy?<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; I think that in Swift, default constructibility makes complete sense for<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; (most?) structs, maybe less so for classes.<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt;<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; &gt; 2) To your original example, it isn’t immediately clear to me that<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; reduce should choose a default identity.  Some types (e.g. integers and FP)<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; belong to multiple different ring algebras, and therefore have different<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; identity values that correspond to the relevant binary operations.<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt;<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; This is a good point that I&#39;ve considered as well but felt that for the<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; most part, there is one particular identity and associated operation that<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; is more prominent and useful than others. Furthermore, modeling different<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; algebras isn&#39;t mutually exclusive with writing generic algorithms that rely<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; on this protocol, you can always introduce some monoidic wrapper type that<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; defines the more appropriate default value and operation.<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt;<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt;<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"></span><span class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374m_2766821119499066179m_-4530764108705073068im m_-7316109184252281435m_-6624483711025557005m_2849072433074184374m_2766821119499066179m_-4530764108705073068HOEnZb m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg">&gt;&gt; Do you mean to argue that for an integer the additive identity should be<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; considered &quot;more prominent and useful&quot; than the multiplicative identity?<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; I&#39;m not aware of any mathematical justification for such a conclusion.<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt;<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"></span><span class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374m_2766821119499066179m_-4530764108705073068im m_-7316109184252281435m_-6624483711025557005m_2849072433074184374m_2766821119499066179m_-4530764108705073068HOEnZb m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg">&gt;&gt; Going to your original example, I should add: other languages provide a<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; version of `reduce` that doesn&#39;t require an initial result (for instance,<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; JavaScript). In JavaScript, `[1, 2, 3].reduce((a, b) =&gt; a + b)` uses the<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; element at array index 0 as the initial result, and the accumulator<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; function is invoked starting with the element at array index 1. This is<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; precisely equivalent to having `reduce` use the additive identity as the<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; default initial result when + is the accumulator function and the<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; multiplicative identity when * is the accumulator function (with the<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; accumulator function being invoked starting with the element at array index<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; 0). It does not require a DefaultConstructible protocol. What more<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt; ergonomic solution could be implemented using a monoidic wrapper type?<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt;<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt;<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;&gt;<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"></span><span class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374m_2766821119499066179m_-4530764108705073068im m_-7316109184252281435m_-6624483711025557005m_2849072433074184374m_2766821119499066179m_-4530764108705073068HOEnZb m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg">&gt; ______________________________<wbr>_________________<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt; swift-evolution mailing list<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt; <a href="mailto:swift-evolution@swift.org" class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg" target="_blank">swift-evolution@swift.org</a><br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt; <a href="https://lists.swift.org/mailman/listinfo/swift-evolution" rel="noreferrer" class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg" target="_blank">https://lists.swift.org/<wbr>mailman/listinfo/swift-<wbr>evolution</a><br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">&gt;<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"></span><span class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374m_2766821119499066179m_-4530764108705073068HOEnZb m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><font color="#888888" class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg">--<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">-Dave<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"></font></span><div class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374m_2766821119499066179m_-4530764108705073068HOEnZb m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><div class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374m_2766821119499066179m_-4530764108705073068h5 m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">______________________________<wbr>_________________<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">swift-evolution mailing list<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><a href="mailto:swift-evolution@swift.org" class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg" target="_blank">swift-evolution@swift.org</a><br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><a href="https://lists.swift.org/mailman/listinfo/swift-evolution" rel="noreferrer" class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg" target="_blank">https://lists.swift.org/<wbr>mailman/listinfo/swift-<wbr>evolution</a><br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"></div></div></blockquote></div><br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"></div></div><br class="m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">______________________________<wbr>_________________<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg">swift-evolution mailing list<br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><a href="mailto:swift-evolution@swift.org" class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg" target="_blank">swift-evolution@swift.org</a><br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"><a href="https://lists.swift.org/mailman/listinfo/swift-evolution" rel="noreferrer" class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg" target="_blank">https://lists.swift.org/<wbr>mailman/listinfo/swift-<wbr>evolution</a><br class="m_-7316109184252281435m_-6624483711025557005m_2849072433074184374gmail_msg m_-7316109184252281435gmail_msg"><br class="m_-7316109184252281435gmail_msg"></blockquote></div></div><br><br></div></div><br class="m_-7316109184252281435gmail_msg">______________________________<wbr>_________________<br class="m_-7316109184252281435gmail_msg"><br><br>swift-evolution mailing list<br class="m_-7316109184252281435gmail_msg"><br><br><a href="mailto:swift-evolution@swift.org" class="m_-7316109184252281435gmail_msg" target="_blank">swift-evolution@swift.org</a><br class="m_-7316109184252281435gmail_msg"><br><br><a href="https://lists.swift.org/mailman/listinfo/swift-evolution" rel="noreferrer" class="m_-7316109184252281435gmail_msg" target="_blank">https://lists.swift.org/<wbr>mailman/listinfo/swift-<wbr>evolution</a><br class="m_-7316109184252281435gmail_msg"><br><br><br class="m_-7316109184252281435gmail_msg"></blockquote></div></div></div></blockquote></div></div>
</div></div></blockquote></div><br></div></div>