[erlang-bugs] Maps equality failure / Maps merge failure
Kostis Sagonas
kostis@REDACTED
Wed Mar 25 16:55:45 CET 2015
On 03/25/2015 04:17 PM, Ulf Wiger wrote:
>> >On 25 Mar 2015, at 00:16, Kostis Sagonas<kostis@REDACTED> wrote:
>> >
>> >The above may seem a bit weird at first but is not at all strange given that lists:sort/1 does not sort according to the (total) term order:
>> >
>> > Eshell V6.3.1 (abort with ^G)
>> > 1> lists:sort([0, 0.0]).
>> > [0,0.0]
>> > 2> lists:sort([0.0, 0]).
>> > [0.0,0]
> But this is according to the documented comparison semantics, surely.
>
> From the Reference Manual:
> "When comparing an integer to a float, the term with the lesser precision will be converted into the other term's type, unless the operator is one of =:= or =/=.”
>
> It’s unfortunate though, and I ran into this issue when writing QuickCheck properties for the ‘sext’ encode/decode.
>
> prop_sort() ->
> ?FORALL({T1,T2}, {term_(), term_()},
> begin
> {X1,X2} = {sext:encode(T1), sext:encode(T2)},
> comp(X1,X2) == comp_i(T1,T2)
> end).
>
> …where comp_i/2 takes care of the case where X1 == X2, X1 =/= X2.
>
> That is, the intuitive property could not be used, given that this also had to be satisfied:
>
> prop_encode() ->
> ?FORALL(T, term_(),
> sext:decode(sext:encode(T)) == T).
>
Not familiar with 'sext' encoding, but I am not sure I get the details
in the problem you run into... For once, I do not see any use of
lists:sort/1 here. Is it buried in the comp*/2 functions somehow? Does
comp/2 use arithmetic rather than term comparison ?
Or can it simply be that the reason the "intuitive" property cannot be
used is because you have used ==/2 instead of =:=/2 there?
Cheers,
Kostis
More information about the erlang-bugs
mailing list