Значение типа листа в Julia

Кажется, что все конкретные типы в Юлии - это типы листьев, но обратное неверно. Например, Type{Int64} - это тип листа, но он не является конкретным:

julia> Type{Int64}.abstract
true

julia> Type{Int64}.isleaftype
true

Я понимаю, что это имеет смысл, потому что нет значений, имеющих тип Type{Int64}. Тип Int64 имеет конкретный тип DataType. Однако, поскольку Type{Int64} не имеет нетривиальных подтипов, он считается типом листа.

Однако документация isleaftype немного запутанна:

  isleaftype(T)

  Determine whether T is a concrete type that can have instances, meaning its
  only subtypes are itself and Union{} (but T itself is not Union{}).

Type{Int64} не может иметь экземпляры, поэтому в первом предложении предполагается, что это не тип листа. Однако действительно верно, что его только подтипы сами по себе и Union{}, поэтому второе предложение предполагает, что оно есть.

Является ли документация, объединяющая типы листов и конкретные типы, и если да, то какой смысл правильный?

Ответ 1

Вы правы; вероятно, была добавлена ​​часть о наличии экземпляров, чтобы дать более интуитивное представление о том, какие типы они есть, но не является строго правильным (если экземпляры определены как typeof(x) === T).

Поле .abstract является свойством семейства типов (Type), которое в основном говорит вам, был ли тип объявлен с помощью abstract (в отличие от Type или immutable или bitstype). Это просто говорит вам, могут ли некоторые члены семьи объявить подтипы, и поэтому они напрямую не связаны с типом листа или конкретным типом. Как вы заметили, Type{Int}.abstract является истинным, но пример, который идет другим путем, заключается в том, что Complex.abstract является ложным, хотя Complex сам по себе не является ни листом, ни конкретным, поскольку, поскольку параметр неуказан.