2016-07-25 91 views
11

朱莉婭的所有具體類型似乎都是葉型,但事實並非如此。例如,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}沒有實例,所以第一句表明,它不是葉型。然而,它確實是唯一的亞型本身,因此第二句話就表明它是。

文檔是否將葉子類型和具體類型相混淆,如果是,哪些含義是正確的?

+0

好問題。只是爲了澄清一點:儘管(1)typeof(x)== Type {Int}沒有'x',那麼(2)'x :: Type {Int}'(即'x == Int')。 (1)是否定義了一個「實例」/「具體類型」對? 'Type'確實有子類型:'DataType','TypeConstructor'和'TypeUnion'。同樣,'DataType :: Type'和'Type :: DataType'都是有效的 - 將值視爲值會導致各種怪異。 –

+2

這並不簡單。這裏有一個相關的討論:https://github.com/JuliaLang/julia/issues/17086 – DNF

回答

6

你是對的;有關實例的部分可能被添加,以便更直觀地瞭解它們的類型,但並不嚴格正確(如果將實例定義爲typeof(x) === T)。

.abstract字段類型家庭(Type),基本上告訴你的類型是否與abstract聲明(而不是typeimmutablebitstype)的屬性。這只是告訴你一些家庭成員是否可以宣佈子類型,因此與葉子類型或具體類型沒有直接關係。正如你所看到的,Type{Int}.abstract是真實的,但是另一個例子是Complex.abstract是錯誤的,儘管Complex本身既不是葉也不是具體的,因爲這個參數是未指定的。