Difference between Tuple and NTuple

Is ‘NTuple’ a more specific ‘Tuple’? It seems that in a Tuple, the elements can have different types, but in an NTuple, the elements must have the same type?

By hitting the ? key in the REPL, you can open the help mode which is really helpful for questions like this.

help?> Tuple
search: Tuple tuple NTuple ntuple NamedTuple @NamedTuple isdispatchtuple UnitUpperTriangular


  A tuple is a fixed-length container that can hold any values of different types, but cannot be modified (it is immutable). The values
  can be accessed via indexing. Tuple literals are written with commas and parentheses:

  julia> (1, 1+1)
  (1, 2)
  julia> (1,)
  julia> x = (0.0, "hello", 6*7)
  (0.0, "hello", 42)
  julia> x[2]
  julia> typeof(x)
  Tuple{Float64, String, Int64}

  A length-1 tuple must be written with a comma, (1,), since (1) would just be a parenthesized value. () represents the empty (length-0)

  A tuple can be constructed from an iterator by using a Tuple type as constructor:

  julia> Tuple(["a", 1])
  ("a", 1)
  julia> Tuple{String, Float64}(["a", 1])
  ("a", 1.0)

  Tuple types are covariant in their parameters: Tuple{Int} is a subtype of Tuple{Any}. Therefore Tuple{Any} is considered an abstract
  type, and tuple types are only concrete if their parameters are. Tuples do not have field names; fields are only accessed by index.
  Tuple types may have any number of parameters.

  See the manual section on Tuple Types.

  See also Vararg, NTuple, ntuple, tuple, NamedTuple.
help?> NTuple
search: NTuple ntuple NamedTuple @NamedTuple UnitUpperTriangular

  NTuple{N, T}

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


  julia> isa((1, 2, 3, 4, 5, 6), NTuple{6, Int})

  See also ntuple.