Binary, List and Tuple Inequalities (Paradox?)

Valentin Micic v@REDACTED
Wed Oct 30 14:34:53 CET 2019

> On 28 Oct 2019, at 10:02, Raimo Niskanen <raimo.niskanen@REDACTED> wrote:
> I'd like to defend the current term order of lists, tuples and
> binaries.
> Lists are compared a'la string comparison, which avoids having to
> traverse the whole list when comparing.  Binaries are compared as lists
> since both are used for handling strings, and also to be compared like
> memcmp does it.
> Tuples are used for general complex terms.  They can be compared size
> first whithout having to be fully traversed, as opposed to lists, which
> is useful in other contexts.  You can thereby choose your data
> structure to select comparision.
> -- 
> Raimo Niskanen

Thanks Raimo,

Your argument seems to have one…well, misconception. I don’t think it would be correct to imply that Binaries are used exclusively for handling strings, but rather, one of their uses may be that.

For example, here's a syntax that is not anything “string-like”:

(tsdb_1_1@REDACTED)3593> <<1:16>> < <<2:16>>. 
(tsdb_1_1@REDACTED)3594> <<50:16>> < <<36:16>>.

As you could see, this pretty much behaves the way we would expect when we compare two integer values, e.g.

1 is less than 2, and so is <<1:16>> < <<2:16>> Technically, we are not talking about strings here, but, rather two 16-bit integers.

I can also say that:

(tsdb_1_1@REDACTED)3597> 1 < 000002.          

When we write: 

(tsdb_1_1@REDACTED)3593> <<1:16>>. 

It would be wrong to pretend that we’re actually talking about a strings (e.g. in alphanumeric sense). This clearly means that the integer value of 1 stored using Big-Endian encoding (e.g. network byte order).

Thus, when we write:  <<2:16>> we get <<0,2>>. When we write: <<2:24>> we get <<0,0,2>>... these values are *not* intended to be strings, but integers.
So, when we add leading zeroes, we do not change the integer value.

So why is then:

(tsdb_1_1@REDACTED)3600> <<1:16>> < <<2:24>>.

First, we’re clearly use integer syntax to encode integer values, then we have the first integer value encoded using 16-bits, and the second integer value encoded using 24-bits.
It just happens so, that 16-bits is used to encode the value of 1, and 24-bits to encode the value of two.

Thus, since 16-bits are less then 24-bits (in length), but also 1 is less than 2, one may expect this to yield TRUE. Yet somehow,  two octets are NOT LESS than there, nor 1 is NOT LESS than 2!

I think this cannot pass the "red-face test”, and thus does not deserve defending.

Contrast this with the way tuples are handled:

(tsdb_1_1@REDACTED)3666> {1,1} < {1,2}.
(tsdb_1_1@REDACTED)3667> {1,3} < {1,2}.
(tsdb_1_1@REDACTED)3668> {1,3} < {1,2,3}.

Considering that Binaries may be used to encode ANYTHING, shouldn’t they be handled the same way as tuples instead of:

(tsdb_1_1@REDACTED)3624> <<1,1>> < <<1,2>>.
(tsdb_1_1@REDACTED)3625> <<1,3>> < <<1,2>>.
(tsdb_1_1@REDACTED)3626> <<1,3>> < <<1,2,3>>.

As I said in my previous email, I do not expect Erlang to change, and for my "own intents and purposes” I am still considering if:

(tsdb_1_1@REDACTED)3626> <<1,3>> < <<1,2,3>>.

should be given more credence than, say TRUE... if nothing else, because two octets are less than three octets.

In other words, if a three-element-tuple, regardless of its content,  could never be less than any given two-elements-tuple, why shouldn't the same hold for Binaries?

Kind regards


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <>

More information about the erlang-questions mailing list