【问题标题】:Meaning of leaf type in JuliaJulia中叶子类型的含义
【发布时间】:2016-07-25 00:15:51
【问题描述】:

似乎 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{},所以第二句话暗示它是。

文档是否将叶类型和具体类型混为一谈,如果是,哪种含义是正确的?

【问题讨论】:

  • 好问题。只是为了澄清一点:虽然没有x 用于哪个(1)typeof(x) == Type{Int},但有哪个(2)x::Type{Int}(即x == Int)。 (1) 是否定义了“实例”/“具体类型”对? Type 确实有子类型:DataTypeTypeConstructorTypeUnion。此外,DataType::TypeType::DataType 都是有效的 - 将类型视为值会导致各种怪异。
  • 这并不简单。这里有相关讨论:github.com/JuliaLang/julia/issues/17086

标签: types julia


【解决方案1】:

你是对的;可能添加了有关拥有实例的部分,以便更直观地了解这些类型,但并不完全正确(如果拥有实例被定义为 typeof(x) === T)。

.abstract 字段是类型族 (Type) 的一个属性,它基本上告诉您该类型是否使用 abstract 声明(而不是 typeimmutablebitstype)。这只是告诉您该家族的某些成员是否可以声明子类型,因此与叶类型或具体类型没有直接关系。正如您所观察到的,Type{Int}.abstract 是真的,但另一个例子是 Complex.abstract 是假的,即使 Complex 本身既不是叶子也不是具体的,因为参数未指定。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多