Value as a type parameter, `X{1}`

In “AbstractArray{T,N}”, I understand T (element type can be anything), but not N, the dimensionality. Why is N not Int?

Indeed Array is a parsmetric type where the second parameter is an integer. N is just the name given to the parameter, it could be Foo or whatever…

N is a value, not a type. A Vector is Array{T,1}, a Matrix is Array{T, 2} etc.

Ah, so parameters to types needn’t be types or type variables (like where T), they may be values as well.

…though not any value:

julia> struct X{T} end

julia> X{8}
X{8}

julia> X{""}
ERROR: TypeError: in Type, in parameter, expected Type, got a value of type String

I suppose only isbits values can be used as a type parameter.

Then I guess my question is, is there any way to constrain value type parameters (where {N isa Int}?) – just like type type parameters can be constrained with where {T <: Number}.

You can enforce it in the constructor.

What would the dimensionality of an Array{Float64, Int} be?

Yeah I was confused about what N was (a type parameter, not necessarily a type).
I was thinking of something like Array{T,N} where {N isa Int} – or indeed a constructor check like @kristoffer.carlsson says.

unfortunately, some times a check in the (inner) constructor is the only way to go do it as Julia doesn’t have dependent type.

Whimsically, we can evaluate Array{Int, 'π'} no problem.
There are no constructors for it alas.