# How to dispatch on a Tuple with unknown length, but elements have same abstract type?

Consider this example:

``````a = (complex(1,2), complex(1.0, 2.0))
``````

The length of `a` is not fixed to 2, but could be arbitrary.
Is there a way to dispatch on this?
I tried

``````a isa NTuple{N, <: Complex} where N
``````

but this is obviously false, because `a` isn’t a NTuple.
It works with

``````a = (complex(1.0,2.0), complex(1.0, 2.0))
``````

though.

``````julia> a = (complex(1,2), complex(3.0,4.0))
(1 + 2im, 3.0 + 4.0im)

julia> a |> typeof
Tuple{Complex{Int64}, ComplexF64}

julia> a isa NTuple{N, <: Complex} where N
false
``````

because

``````julia> complex(1,2) |> typeof
Complex{Int64}

julia> complex(3.0,4.0) |> typeof
ComplexF64 (alias for Complex{Float64})
``````

Sorry, overlooked the `abstract type` in the question.

Might wanna use

``````julia> a isa NTuple{N,Complex{<:Real}} where N
true
``````
1 Like

I figured out that I have to leave out the first `<:` in the second argument of the NTuple.
This works, too:

``````a isa NTuple{N, Complex} where N
``````

The rules for `Tuple` subtyping are special: tuples are covariant wrt their type parameters.
That means, `a` is an `NTuple{2, Complex}`. On the other hand, `a isa NTuple{2,T} where {T<:Complex}` is false because of the diagonal rule.

1 Like