Julia 言語における「任意の要素数のタプル」の型

Julia 言語ではタプルの型が要素数ごとに異なる。例えば Int のみを要素に持つタプルなら (1,)Tuple{Int}(1,2)Tuple{Int,Int} 、という具合で違う型となっている。では任意の要素数のタプルにマッチする型は?と調べてみたところ、そのような型は Tuple{Vararg{Int}} になるとのこと。 Vararg を使うのがポイントだね。公式ドキュメントでは "Vararg Tuple Types" の項で紹介されている。

julia> typeof((1,))
Tuple{Int64}

julia> typeof((1, 2))
Tuple{Int64,Int64}

julia> typeof((1, 2, 3))
Tuple{Int64,Int64,Int64}

julia> (1,) isa Tuple{Vararg{Int}}
true

julia> (1,2) isa Tuple{Vararg{Int}}
true

julia> (1,2,3) isa Tuple{Vararg{Int}}
true

Julia では Python に比べて型が重要で、適切にマルチディスパッチされる関数を定義するために扱うデータの型を正確に知りたくなることがあったりする。型を調べたくなったら、Julia が用意している型を扱う関数群を使うと良い。今回の調べもので言うと、指定された複数の型にマッチする(最小公倍数的な)型を返す typejoin 関数が使える:

julia> typejoin(Tuple{}, Tuple{Int}, Tuple{Int,Int})
Tuple{Vararg{Int64,N} where N}

julia> # N は最後の型引数なので "where N" は略せる
julia> Tuple{Vararg{Int64}} == Tuple{Vararg{Int64,N} where N}
true

こういう細かい部分で書き方が分からず調べて回る必要が出てくるたびに「この言語、まだ慣れていないんだなぁ」と思う。今のところ Julia は非常に気に入っているので、こういう気付きや疑問が無くなるまで使い込んでいきたいものだ。