<div dir="ltr">On Mon, Apr 24, 2017 at 7:16 PM, Dave Abrahams <span dir="ltr">&lt;<a href="mailto:dabrahams@apple.com" target="_blank">dabrahams@apple.com</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 class="HOEnZb"><div class="h5"><br>
on Sun Apr 23 2017, Xiaodi Wu &lt;<a href="http://xiaodi.wu-AT-gmail.com" rel="noreferrer" target="_blank">xiaodi.wu-AT-gmail.com</a>&gt; wrote:<br>
<br>
&gt; On Sun, Apr 23, 2017 at 4:32 PM, Dave Abrahams &lt;<a href="mailto:dabrahams@apple.com">dabrahams@apple.com</a>&gt; wrote:<br>
&gt;<br>
&gt;&gt;<br>
&gt;&gt; on Sun Apr 23 2017, 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;<br>
&gt;&gt; &gt; On Sun, Apr 23, 2017 at 7:54 AM, Dave Abrahams &lt;<a href="mailto:dabrahams@apple.com">dabrahams@apple.com</a>&gt;<br>
&gt;&gt; wrote:<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; on Sun Apr 23 2017, 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 Sat, Apr 22, 2017 at 11:00 PM, Dave Abrahams &lt;<a href="mailto:dabrahams@apple.com">dabrahams@apple.com</a>&gt;<br>
&gt;&gt; &gt;&gt; wrote:<br>
&gt;&gt; &gt;&gt; &gt;<br>
&gt;&gt; &gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt; &gt; That is to say, I would expect the standard library to supply an<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt; &gt; alternative implementation of equality for Array&lt;T where T :<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt; &gt; FloatingPoint&gt;.<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt; And also for Dictionary?  What do you expect to happen when<br>
&gt;&gt; Double is<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt; used as a dictionary key and it happens to be NaN?<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt; The proposal is very clear that `Dictionary` and `sort` will always<br>
&gt;&gt; &gt;&gt; use<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt; level 2 comparison.<br>
&gt;&gt; &gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; &gt;&gt; Yes, but I&#39;m not asking about my own proposal :-).  My question is,<br>
&gt;&gt; what<br>
&gt;&gt; &gt;&gt; &gt;&gt; are *your* expectations for dictionaries or sets, specifically for<br>
&gt;&gt; the<br>
&gt;&gt; &gt;&gt; &gt;&gt; insertion of NaN keys and for comparison of whole collections?<br>
&gt;&gt; &gt;&gt; &gt;<br>
&gt;&gt; &gt;&gt; &gt; My expectations for comparison of collections clearly differ from<br>
&gt;&gt; &gt;&gt; &gt; yours.<br>
&gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; Maybe, in that you *have* strong expectations when it comes to FP.  I&#39;m<br>
&gt;&gt; &gt;&gt; still trying to figure out what mine should be.<br>
&gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; &gt; For me, I think it is a reasonable expectation that, for all `x` and<br>
&gt;&gt; &gt;&gt; &gt; `y` where `x == y`, `[x] == `[y]`, `[[x]] == [[y]]`, `[x, x, x] == [y,<br>
&gt;&gt; &gt;&gt; &gt; y, y]`, etc.<br>
&gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; It seems pretty obvious when you put it that way.  Here&#39;s an interesting<br>
&gt;&gt; &gt;&gt; question: how much of that is because of the way array literals let you<br>
&gt;&gt; &gt;&gt; “see through” the value being compared to its elements?<br>
&gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; I don&#39;t think it&#39;s the visual representation. More to do with<br>
&gt;&gt; expectations<br>
&gt;&gt; &gt; as to what an array is.<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; If `a == b`, then `thingWrappingA == thingWrappingB`, for values of<br>
&gt;&gt; &quot;thing&quot;<br>
&gt;&gt; &gt; that are &quot;wrapper-like&quot; (I will blithely leave the term undefined) rather<br>
&gt;&gt; &gt; than, say, stateful class instances.<br>
&gt;&gt;<br>
&gt;&gt; wrapper-like probably means &quot;Monad&quot;<br>
&gt;&gt;<br>
&gt;&gt; &gt;&gt; Also, does the same go for != ? That&#39;s telling w.r.t. NaN.<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; Yes, I think so. I&#39;d have to think harder to be more sure of that.<br>
&gt;&gt;<br>
&gt;&gt; Well, that&#39;s the hard one, so please do.  We can easily shift the<br>
&gt;&gt; proposal so -0.0 == +0.0, but NaNs are harder to account for.<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt; Right, more thought is necessary. It was obviated when I was writing my<br>
&gt; proposed design, because NaN != NaN simply traps, and [NaN] != [NaN] would<br>
&gt; too.<br>
<br>
</div></div>More thought was obviated?  That&#39;s a neat trick! ;-)<br>
<span class=""><br>
&gt;&gt; &gt; Hmm, not an expert, but I don&#39;t see that definition. MathWorld &lt;<br>
&gt;&gt; &gt; <a href="http://mathworld.wolfram.com/ComparableElements.html" rel="noreferrer" target="_blank">http://mathworld.wolfram.com/<wbr>ComparableElements.html</a>&gt; confirms that the<br>
&gt;&gt; &gt; Wikipedia formulation is correct:<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; x is incomparable to y if neither x ***&gt;=*** y nor x ***&lt;=*** y.<br>
&gt;&gt;<br>
&gt;&gt; Ah, right.  But this is where it gets tricky to interpret, because IIUC<br>
&gt;&gt; in orderings in general, there is no concept of equality; there&#39;s just<br>
&gt;&gt; &quot;x precedes y or it doesn&#39;t.&quot;  So when these articles use &lt;= or &lt;, it is<br>
&gt;&gt; a stand-in for &quot;the ordering predicate&quot;.  In ancient times, I wrote an<br>
&gt;&gt; article exploring some of this<br>
&gt;&gt; (<a href="http://web.archive.org/web/20120422220137/http://cpp-" rel="noreferrer" target="_blank">http://web.archive.org/web/<wbr>20120422220137/http://cpp-</a><br>
&gt;&gt; <a href="http://next.com/archive/2010/02/order-i-say/" rel="noreferrer" target="_blank">next.com/archive/2010/02/<wbr>order-i-say/</a>).<br>
&gt;&gt; I always go back to that when I need to ground myself, though using your<br>
&gt;&gt; own article for that has its perils.  Please check that out and let me<br>
&gt;&gt; know if you think I&#39;m off-base, because the notion of incomparability in<br>
&gt;&gt; that article is central to my understanding (and is, I believe,<br>
&gt;&gt; consistent with <a href="https://en.wikipedia.org/wiki/Weak_ordering" rel="noreferrer" target="_blank">https://en.wikipedia.org/wiki/<wbr>Weak_ordering</a>, FWIW).<br>
&gt;<br>
&gt; IIUC, you&#39;re talking about a _strict_ partial order, which is<br>
&gt; _irreflexive_.<br>
<br>
</span>That may be another name for the same thing.  The terminology in this<br>
area is... problematic.  But look for “incomparable” at<br>
<a href="https://en.wikipedia.org/wiki/Weak_ordering" rel="noreferrer" target="_blank">https://en.wikipedia.org/wiki/<wbr>Weak_ordering</a> and you&#39;ll see that I&#39;m<br>
consistent with that.<br>
<span class=""><br>
&gt; Such a relation is totally silent, however, as to whether x and y are<br>
&gt; equivalent if `x !&lt;&gt; y`.<br>
<br>
</span>Correct; that&#39;s what I meant by “in orderings in general, there&#39;s no<br>
concept of equality.”  However, if `x !&lt;&gt; y` in a strict weak ordering,<br>
`x` and `y` are part of an equivalence class, each element of which has<br>
the same relationships with all the other elements of the set.<br>
<span class=""><br>
&gt; As a standalone predicate, it isn&#39;t sufficient to order a set which<br>
&gt; contains a pair of incomparable values in the way that you and Ben<br>
&gt; propose. For instance, suppose I&#39;m trying to sort an array with 42 and<br>
&gt; NaN using a generic algorithm that can&#39;t just test `isNaN`.<br>
&gt; So, to the algorithm, these values are an opaque `a` and `b`.  Since<br>
&gt; !(a &lt; b) and !(b &lt; a), there&#39;s no information I can get from the<br>
&gt; predicate to tell me which one is the &quot;problem value&quot; (is it a, or is<br>
&gt; it b: which one is NaN?).<br>
<br>
</span>I&#39;m sorry, I don&#39;t follow.  Your statement that our ordering of incomparable<br>
values is insufficient seems to lack context, so I can&#39;t evaluate it.<br>
I&#39;ll note that in a strict weak ordering, incomparable values are not<br>
problematic, but Floating Point doesn&#39;t have a strict weak ordering.<br>
<span class=""><br>
&gt; In the context of set theory, I&#39;m reading that comparability is defined in<br>
&gt; terms of _weak_ partial orders (which are reflexive).<br>
<br>
</span>Where are you reading that?<br>
<br>
As my article notes, trying to analyze the space can be really<br>
confusing, because *strict weak* partial orders are *not* reflexive.<br>
<span class=""><br>
&gt; I guess I&#39;ve just assumed we&#39;re using this definition of comparability<br>
&gt; because IEEE floating point appears to adopt it.<br>
<br>
</span>What makes you say that?<br>
<span class=""><br>
&gt; With a _weak_ partial order as a predicate, you *can* order a set<br>
&gt; which contains a pair of incomparable values:<br>
&gt;<br>
&gt; * Given: 42 (&quot;a&quot;) and NaN (&quot;b&quot;).<br>
&gt; * First, we note that !(a &lt;= b) &amp;&amp; !(b &lt;= a). So, we have a pair of<br>
&gt; incomparable values.<br>
&gt; * Then, we ask which value is not a member of the partially ordered set on<br>
&gt; which the &lt;= relation is defined.<br>
&gt; * We find that (a &lt;= a) == true but (b &lt;= b) == false.<br>
&gt; * We conclude that b is the &quot;problem value&quot; (NaN) which is not a member of<br>
&gt; the partially ordered set.<br>
&gt; * We decide to send it to the back of the line.<br>
<br>
</span>Yes, I understand that.  But I don&#39;t think I get the point yet.<br>
<span class=""><br>
&gt;&gt; &gt; I am not suggesting this particular name, but<br>
&gt;&gt; &gt; `array1.<wbr>elementsIndistinguishable(<wbr>from: array2)` expresses something of<br>
&gt;&gt; the<br>
&gt;&gt; &gt; idea.<br>
&gt;&gt;<br>
&gt;&gt; I&#39;m very skeptical of introducing a notion of indistinguishability<br>
&gt;&gt; that&#39;s distinct from equality.<br>
&gt;<br>
&gt; I think this goes back to the above about what we want equality to be. If<br>
&gt; equality is to be distinguished from incomparability (as it is in floating<br>
&gt; point), then we must have some notion of what happens when two values<br>
&gt; cannot be compared.<br>
<br>
</span>That two elements are incomparable doesn&#39;t mean you can&#39;t compare them.<br>
It means that when you do compare them, you&#39;ll find they have no<br>
relative ordering, like siblings in a DAG.  See<br>
<a href="https://en.wikipedia.org/wiki/Comparability" rel="noreferrer" target="_blank">https://en.wikipedia.org/wiki/<wbr>Comparability</a><br>
<br>
More later, if I can find time...<br></blockquote><div><br></div><div>Yeah, I&#39;ll try to get to this at some point, but now that the weekend is over I think I&#39;m running out of steam as well...</div><div><br></div><div><br></div></div></div></div>