Sorry, yeah, that&#39;s what I meant to ask. I can&#39;t see how it would make anything unworkable, but I agree that it might not be very useful.<br><div class="gmail_quote"><div dir="ltr">On Fri, Jul 22, 2016 at 18:50 Dave Abrahams via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a>&gt; wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><br>
on Fri Jul 22 2016, Xiaodi Wu &lt;<a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a>&gt; wrote:<br>
<br>
&gt; On Fri, Jul 22, 2016 at 5:48 PM, Dave Abrahams via swift-evolution &lt;<br>
&gt; <a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a>&gt; wrote:<br>
&gt;<br>
&gt;&gt;<br>
&gt;&gt; on Fri Jul 22 2016, Xiaodi Wu &lt;<a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a>&gt; wrote:<br>
&gt;&gt;<br>
&gt;&gt; &gt; On Fri, Jul 22, 2016 at 3:54 PM, Dave Abrahams &lt;<a href="mailto:dabrahams@apple.com" target="_blank">dabrahams@apple.com</a>&gt;<br>
&gt;&gt; wrote:<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; on Fri Jul 22 2016, Xiaodi Wu &lt;<a href="http://xiaodi.wu-AT-gmail.com" rel="noreferrer" target="_blank">xiaodi.wu-AT-gmail.com</a>&gt; wrote:<br>
&gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; &gt; On Fri, Jul 22, 2016 at 1:05 PM, Dave Abrahams via swift-evolution &lt;<br>
&gt;&gt; &gt;&gt; &gt; <a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a>&gt; wrote:<br>
&gt;&gt; &gt;&gt; &gt;<br>
&gt;&gt; &gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; &gt;&gt; on Thu Jul 21 2016, Duan &lt;<a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a>&gt; wrote:<br>
&gt;&gt; &gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt; Great proposal. I want to second that areSame may mislead user to<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt; think this is about identity.<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt; I like areEquivalent() but there may be better names.<br>
&gt;&gt; &gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; &gt;&gt; It really *is* about identity as I posted in a previous message.<br>
&gt;&gt; &gt;&gt; &gt;<br>
&gt;&gt; &gt;&gt; &gt; Correct me if I&#39;m wrong:<br>
&gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; Not to put too fine a point on it, but... ;-)<br>
&gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; Please do :) This discussion has been very edifying (for me), so thank<br>
&gt;&gt; you<br>
&gt;&gt; &gt; for taking the time.<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt;&gt; &gt; Identity is an equality relation, and `==` is about just that.<br>
&gt;&gt; &gt;&gt; &gt; By contrast, `areSame()` is to define an *equivalence* relation<br>
&gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; The phrase “equality relation” has no commonly-understood formal or<br>
&gt;&gt; &gt;&gt; informal meaning AFAIK.<br>
&gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; “Identity” is a slightly informal term IIUC, but for any<br>
&gt;&gt; &gt;&gt; commonly-understood meaning of that word, the “is identical to” is<br>
&gt;&gt; &gt;&gt; *always* an equivalence relation.<br>
&gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; &gt; through which, by default, `==` is to be dispatched.<br>
&gt;&gt; &gt;&gt; &gt; Since this design specifically<br>
&gt;&gt; &gt;&gt; &gt; contemplates scenarios in which certain Equatables will override `==`<br>
&gt;&gt; &gt;&gt; *not*<br>
&gt;&gt; &gt;&gt; &gt; to dispatch through `areSame()`,<br>
&gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; [Since `==` wouldn&#39;t be a protocol requirement (except in<br>
&gt;&gt; FloatingPoint),<br>
&gt;&gt; &gt;&gt; it&#39;s technically shadowing rather than overriding in the general case.<br>
&gt;&gt; &gt;&gt; I imagine this detail doesn&#39;t matter to your point]<br>
&gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; &gt; the latter function evaluates only *equivalence* with respect to an<br>
&gt;&gt; &gt;&gt; &gt; arbitrary equivalence relation, not identity.<br>
&gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; Saying that areSame is just any old arbitrary equivalence relation,<br>
&gt;&gt; &gt;&gt; would complicate the system in undesirable ways.<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; Ah, well, there goes my dream of using `{ return true }` as my<br>
&gt;&gt; equivalence<br>
&gt;&gt; &gt; relation... :P<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt;&gt; It&#39;s<br>
&gt;&gt; &gt;&gt; a bit subtle but I&#39;ll try to walk you through the reasoning:<br>
&gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; 1. We had a choice about whether to document that Comparable requires<br>
&gt;&gt; &gt;&gt;    that &lt;=&gt; be a total order or a strict weak order [A strict weak order<br>
&gt;&gt; &gt;&gt;    is a total order over equivalence classes of elements that aren&#39;t<br>
&gt;&gt; &gt;&gt;    ordered with respect to other members of the same class].  Either one<br>
&gt;&gt; &gt;&gt;    will work for the standard algorithms.<br>
&gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; 2. Because the concept of total order is more accessible and requiring<br>
&gt;&gt; &gt;&gt;    &lt;=&gt; to be a total order doesn&#39;t seem to reduce expressivity, we<br>
&gt;&gt; &gt;&gt;    decided on a total order.<br>
&gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; 3. The only difference between these two orderings is that in a total<br>
&gt;&gt; &gt;&gt;    order the equivalence classes have only a single element, **which<br>
&gt;&gt; &gt;&gt;    means that the equivalence relation in play has to, in some sense,<br>
&gt;&gt; &gt;&gt;    tell you whether two things are identical**.  This all comes down to<br>
&gt;&gt; &gt;&gt;    how you measure “are a and b the same element?”<br>
&gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; The alternative is to say that &lt;=&gt; is just a strict weak ordering and<br>
&gt;&gt; &gt;&gt; areSame is just any arbitrary equivalence relation, but that really<br>
&gt;&gt; &gt;&gt; complicates everything (not just the definition of Comparable).  For<br>
&gt;&gt; &gt;&gt; example, you can&#39;t document `a.firstIndex(of: b)` as the first index<br>
&gt;&gt; where<br>
&gt;&gt; &gt;&gt; `b` appears in `a`; you have to say it&#39;s the first index of an element<br>
&gt;&gt; &gt;&gt; that satisfies `{ Element.areSame($0, b) }`.<br>
&gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; I hadn&#39;t considered how closely yoked Equatable and Comparable have<br>
&gt;&gt; &gt; to be.  You can&#39;t have Comparable refine Equatable such that<br>
&gt;&gt; &gt; `Comparable.areSame(_:)` has stricter semantic requirements than<br>
&gt;&gt; &gt; plain Equatable?<br>
&gt;&gt;<br>
&gt;&gt; Not if you want algorithms requiring Equatable to make sense.  There&#39;s<br>
&gt;&gt; just no use for anything weaker than an equivalence relation.<br>
&gt;&gt;<br>
&gt;<br>
&gt; I&#39;m assuming you mean:<br>
&gt; s/equivalence relation/identity/<br>
<br>
No, meant what I wrote, but maybe I misunderstood your question.  I<br>
guess you were suggesting that `Equatable.areSame` could define an<br>
equivalence relation but that `&lt;=&gt;` might distinguish elements that<br>
weren&#39;t distinguished by `Equatable.areSame`?<br>
<br>
Personally I don&#39;t see a use for that.  Remember, `Equatable` and<br>
`Comparable` just define the default comparisons that you get when you<br>
don&#39;t explicitly supply a comparison closure to these algorithms.<br>
You&#39;re always free to use an arbitrary equivalence relation or strict<br>
weak ordering with the closure-accepting versions of the algorithms.<br>
<br>
&gt; In that case, I&#39;d think collapsing `areSame(_:)` into `===` and furnishing<br>
&gt; some other way of comparing memory addresses for class types is the most<br>
&gt; sensible way to go.<br>
&gt;<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt;&gt; &gt; Put another way, the future `Equatable` is a contract that conforming<br>
&gt;&gt; &gt;&gt; &gt; types will supply a definition of equality *and* an equivalence<br>
&gt;&gt; &gt;&gt; &gt; relation, where the former by default is dispatched through the<br>
&gt;&gt; &gt;&gt; &gt; latter; but it is specifically envisioned that the two may be<br>
&gt;&gt; &gt;&gt; &gt; separated in domain-specific scenarios.<br>
&gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; That is correct.  However, the equivalence relation in question still<br>
&gt;&gt; &gt;&gt; is, in some very real sense, an identity check.<br>
&gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; &gt;&gt; But<br>
&gt;&gt; &gt;&gt; &gt;&gt; that doesn&#39;t change the fact that areEquivalent might be a better<br>
&gt;&gt; name.<br>
&gt;&gt; &gt;&gt; &gt;&gt; It&#39;s one of the things we considered; it just seemed long for no real<br>
&gt;&gt; &gt;&gt; &gt;&gt; benefit.<br>
&gt;&gt; &gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt; Daniel Duan<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt; Sent from my iPhone<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt; On Jul 21, 2016, at 6:32 PM, Robert Widmann via swift-evolution<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt; &lt;<a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a>&gt; wrote:<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt; On Jul 21, 2016, at 6:19 PM, Xiaodi Wu &lt;<a href="mailto:xiaodi.wu@gmail.com" target="_blank">xiaodi.wu@gmail.com</a>&gt;<br>
&gt;&gt; wrote:<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt;<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt; This is nice. Is `areSame()` being proposed because static `==`<br>
&gt;&gt; is<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt; the status quo and you&#39;re trying to make the point that `==` in<br>
&gt;&gt; the<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt; future need not guarantee the same semantics?<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt; Yep!  Equivalence and equality are strictly very different things.<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt;<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt; Nit: I think the more common term in stdlib would be<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt; `areEquivalent()`. Do you think `same` in that context<br>
&gt;&gt; (independent<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt; of the word &quot;ordering&quot;) might erroneously suggest identity?<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt; There is room for improvement here.  Keep ‘em coming.<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt;<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt;<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt;&gt; On Thu, Jul 21, 2016 at 8:11 PM, Robert Widmann via<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt;&gt; swift-evolution<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt;&gt; &lt;<a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a>&gt; wrote:<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt;&gt; Hello Swift Community,<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt;&gt;<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt;&gt; Harlan Haskins, Jaden Geller, and I have been working on a<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt;&gt; proposal to clean up the semantics of ordering relations in the<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt;&gt; standard library.  We have a draft that you can get as a gist.<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt;&gt; Any feedback you might have about this proposal helps - though<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt;&gt; please keeps your comments on Swift-Evolution and not on the<br>
&gt;&gt; gist.<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt;&gt;<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt;&gt; Cheers,<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt;&gt;<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt;&gt; ~Robert Widmann<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt;&gt;<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt;&gt;<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt;&gt;<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt;&gt;<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt;&gt;<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt;&gt; _______________________________________________<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt;&gt; swift-evolution mailing list<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt;&gt; <a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a><br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt;&gt; <a href="https://lists.swift.org/mailman/listinfo/swift-evolution" rel="noreferrer" target="_blank">https://lists.swift.org/mailman/listinfo/swift-evolution</a><br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt;&gt;<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt;<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt; _______________________________________________<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt; swift-evolution mailing list<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt; <a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a><br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt; <a href="https://lists.swift.org/mailman/listinfo/swift-evolution" rel="noreferrer" target="_blank">https://lists.swift.org/mailman/listinfo/swift-evolution</a><br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt; _______________________________________________<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt; swift-evolution mailing list<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt; <a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a><br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt; <a href="https://lists.swift.org/mailman/listinfo/swift-evolution" rel="noreferrer" target="_blank">https://lists.swift.org/mailman/listinfo/swift-evolution</a><br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;<br>
&gt;&gt; &gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; &gt;&gt; --<br>
&gt;&gt; &gt;&gt; &gt;&gt; Dave<br>
&gt;&gt; &gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; &gt;&gt; _______________________________________________<br>
&gt;&gt; &gt;&gt; &gt;&gt; swift-evolution mailing list<br>
&gt;&gt; &gt;&gt; &gt;&gt; <a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a><br>
&gt;&gt; &gt;&gt; &gt;&gt; <a href="https://lists.swift.org/mailman/listinfo/swift-evolution" rel="noreferrer" target="_blank">https://lists.swift.org/mailman/listinfo/swift-evolution</a><br>
&gt;&gt; &gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; --<br>
&gt;&gt; &gt;&gt; Dave<br>
&gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt; _______________________________________________<br>
&gt;&gt; &gt; swift-evolution mailing list<br>
&gt;&gt; &gt; <a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a><br>
&gt;&gt; &gt; <a href="https://lists.swift.org/mailman/listinfo/swift-evolution" rel="noreferrer" target="_blank">https://lists.swift.org/mailman/listinfo/swift-evolution</a><br>
&gt;&gt; &gt;<br>
&gt;&gt;<br>
&gt;&gt; --<br>
&gt;&gt; Dave<br>
&gt;&gt;<br>
&gt;&gt; _______________________________________________<br>
&gt;&gt; swift-evolution mailing list<br>
&gt;&gt; <a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a><br>
&gt;&gt; <a href="https://lists.swift.org/mailman/listinfo/swift-evolution" rel="noreferrer" target="_blank">https://lists.swift.org/mailman/listinfo/swift-evolution</a><br>
&gt;&gt;<br>
&gt; _______________________________________________<br>
&gt; swift-evolution mailing list<br>
&gt; <a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a><br>
&gt; <a href="https://lists.swift.org/mailman/listinfo/swift-evolution" rel="noreferrer" target="_blank">https://lists.swift.org/mailman/listinfo/swift-evolution</a><br>
&gt;<br>
<br>
--<br>
Dave<br>
<br>
_______________________________________________<br>
swift-evolution mailing list<br>
<a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a><br>
<a href="https://lists.swift.org/mailman/listinfo/swift-evolution" rel="noreferrer" target="_blank">https://lists.swift.org/mailman/listinfo/swift-evolution</a><br>
</blockquote></div>