A number type that has only one value (zero) and needs no storage: see https://en.wikipedia.org/wiki/Zero_ring.
- GitHub: Source code repository
The zero ring is a very special type of number: There is only one
value (zero). Booleans, for example, have two values (false
and
true
), Int8
have 256 values, etc. A ZeroElem
has only one value
(zeroelem
). This is similar to Nothing
, except that ZeroElem
is
a subtype of Number
whereas Nothing
isn't, and it doesn't indicate
that some information is missing (as Missing
would).
At times, you might have a data structure holding numbers, but one is only interested in the "skeleton" of the data structure, and not into the numbers it can hold. Examples are:
- a graph with weighted edges, but the weights are not relevant
- a sparse matrix, but only the sparsity structure is interesting
Nothing
is not a subtype of Number
, which makes some linear
algebra operations fail. It would, of course, in principle be possible
to make Nothing
be a subtype of Number
, but this is not a good
idea as Nothing
is a general concept that has nothing to do with
numbers, addition, multiplication, etc.
In a similar manner, Missing
indicates that certain information is
missing. This is not the case here; all the necessary information is
there. It makes sense to define missing + zeroelem
, and the result
should be missing
.
A ZeroElem
number takes no storage:
julia> @allocated Array{ZeroElem}(undef, 1000)
80
julia> @allocated Array{Nothing}(undef, 1000)
80
julia> @allocated Array{Bool}(undef, 1000)
1088
The 80 bytes reported here are for the array metadata (its size and shape etc.); there are no actual data allocated.