<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">2017-10-27 22:25 GMT+02:00 Stanislaw Klekot <span dir="ltr"><<a href="mailto:erlang.org@jarowit.net" target="_blank">erlang.org@jarowit.net</a>></span>:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><span class="gmail-">On Fri, Oct 27, 2017 at 09:36:58PM +0200, Richard Carlsson wrote:<br>
> 2017-10-27 17:45 GMT+02:00 Sverker Eriksson <<a href="mailto:sverker.eriksson@ericsson.com">sverker.eriksson@ericsson.com</a><wbr>><br>
> ><br>
> > How would you order  #{1 => x, 1.0 => y} and #{1 => y, 1.0 => x}<br>
> > if you can't order 1 and 1.0?<br>><br>
> As long as we're talking about the arithmetic term order (<, >, ==), I<br>
> don't see why they would need to be. Look at tuples:<br>
><br>
>   {1, 1.0} < {1.0, 1}.<br>
>   false<br>
>   {1, 1.0} > {1.0, 1}.<br>
>   false<br>
>   {1, 1.0} == {1.0, 1}.<br>
>   true<br>
>   {1, 1.0} =:= {1.0, 1}.<br>
>   false<br>
><br>
> Maps ought to behave analogously, in the arithmetic ordering.<br>
<br>
</span>The problem is, the tuples you provide and comparison operators (<, >,<br>
=<, >=, and == (not =:= one)) form a well-defined partial order (total<br>
order, actually); mainly, if A =< B and B =< A, then A == B. Being<br>
a partial order is a very important property of Erlang's type system,<br>
one that was quite explicitly baked in the VM and is used in many<br>
different places.</blockquote><div><br></div><div>No, the real problem, that I begin to see now, is that if arithmetic ordering is used, two keys could appear to be the same, and if their corresponding values differ, it is not clear in which order to compare them. I guess that's what Sverker was trying to convey, but I missed it at first.</div><div><br></div><div>So, using tuples {K1, ... Kn, V1, ... Vn} again for comparison, Sverker's example could become either:</div><div><br></div><div><font face="monospace, monospace">  {1, 1.0, x, y} < {1, 1.0, y, x}</font><br></div><div>or</div><div><font face="monospace, monospace">  {1.0, 1, y, x} == {1, 1.0, y, x}</font><br></div><div><br></div><div>(switching the order of the keys in the left tuple), both of which would be equally "legal" since 1 == 1.0. But this switches the order of x and y, so that the comparisons of the maps would give different results. One way to avoid this situation would be to say that you can't have two keys that compare equal with == in the same map, just as for an orddict.</div><div><br></div></div></div></div>