# How to write the type signature of a tuple of types?

For example, I have a type

``````abstract type Axis{a,A} end
``````

How can I express in function type signature that I have a tuple of unknown numbers of `Axis` with different type parameters? For instance,

``````julia> Tuple{Axis{a,A}, Axis{b,B}} where {a,b,A,B}
Tuple{Axis{a,A},Axis{b,B}} where B where A where b where a

julia> Tuple{Axis{a,A}, Axis{b,B}, Axis{c,C}} where {a,b,A,B,c,C}
Tuple{Axis{a,A},Axis{b,B},Axis{c,C}} where C where c where B where A where b where a
``````

How can I express them in a general unified type? I tried as follows but failed.

``````julia> Tuple{Axis...}
ERROR: MethodError: no method matching iterate(::Type{Axis})
Closest candidates are:
iterate(::Core.SimpleVector) at essentials.jl:589
iterate(::Core.SimpleVector, ::Any) at essentials.jl:589
iterate(::ExponentialBackOff) at error.jl:171
...
Stacktrace:
[1] append_any(::Tuple{DataType}, ::Vararg{Any,N} where N) at ./essentials.jl:426
[2] top-level scope at none:0
``````

In Python I can have

``````from typing import Tuple
# To specify a variable-length tuple of homogeneous type, use literal ellipsis, e.g.
Tuple[int, ...]
``````

which is very handy. I want something similar in Julia.

Try the special `Vararg` type:

``````julia> ("a",) isa Tuple{String, Vararg{Int}}
true

julia> ("a",1,1,1) isa Tuple{String, Vararg{Int}}
true
``````
1 Like

I think you are looking for `NTuple{Axis,2}` etc. Also look at `Vararg`. Search the manual and you will find examples.

1 Like

Thanks, just to point out that

``````NTuple{N, T}

A compact way of representing the type for a tuple of length N where all elements are
of type T.
``````

I found that I could write `NTuple{N, T} where N` to solve this. I did not think about using `NTuple` was because I thought first I need to specify `N`, which is not known. And also, a `UnionAll` type does allow me to have different parameterized `Axis`s:

``````julia> struct B{a, A} <: Axis{a, A}
data::A
end

julia> B{a}(data::A) where {a, A} = B{a, A}(data)

julia> (B{:s}(rand(3)), B{:q}([1,2,4,5])) isa NTuple{N, Axis} where N
true
``````