So what’s the difference between Pair{A,B}
and Tuple{A,B}
? Why do we have both instead of one?
Types transport meaning. Same reason why we don’t always just use blobs of memory, even though everything boils down to that
E.g. you want to construct a pair with this syntax: a => b
, but adding this constructor to Tuples won’t make much sense!
Tuples are much more low-level, being one of the few parts that are defined in non-Julia code in the src
directory. They also have some slightly different behaviours than other types, such as allowing an arbitrary number of arguments, and being covariant,
julia> isa((1,3),Tuple{Real,Real})
true
julia> isa(1=>3,Pair{Real,Real})
false
Pairs on the other hand are just a regular immutable type.
I’m quite new to Julia. I found this thread trying to understand the difference between Pair and Tuple. While some of my question have been answered above, I still have these three:
-
Why is Dict based on Pair, not Tuple ? (Perhaps covariance is bad for Dict ? if I understand what covariance means from simonbyrne’s post.)
-
How is Pair used outside Dict contexts?
-
Is covariance the only fundamental semantic difference?
Questions 2 & 3 boil down to, basically, in what context should I prefer one over the other when both seem to work?
I don’t think that (lack of) covariance motivated the implementation of Dict
, Pair
is simply convenient with the =>
syntax. In any case, note that internally Dict
does not use Pair
, it is just for construction.
Pair
is generally used in contexts where you need to store a pair of objects that belong together.
I would mostly use Pair
to signify intent, and for dispatch. Eg the Dict(::Pair...)
constructor is different from the fallback Dict(itr)
.