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 は非常に気に入っているので、こういう気付きや疑問が無くなるまで使い込んでいきたいものだ。