2016-07-25 3 views
11

Juliaのすべての具体的な型は葉型ですが、その逆は真ではないようです。例えば、Type{Int64}は、枚葉式であるが、それは、コンクリートではありません:タイプType{Int64}を持っている値がないのでJuliaの葉型の意味

julia> Type{Int64}.abstract 
true 

julia> Type{Int64}.isleaftype 
true 

私の理解では、これは理にかなっていることです。タイプInt64は具体的なタイプDataTypeです。ただし、Type{Int64}には重要なサブタイプがないため、リーフタイプと見なされます。インスタンスを持つことができない

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}ので、最初の文は、それが葉のタイプではないことを示唆している:

しかし、isleaftypeのドキュメントは少し混乱しています。しかし、唯一のサブタイプがそれ自身であり、Union{}であることは確かに真実です。したがって、2番目の文はそれがそうであることを示唆しています。

葉のタイプと具体的なタイプのドキュメントが混在していますか?そうであれば、意味は正しいですか?

+0

良い質問です。 (1) 'typeof(x)== Type {Int}'の 'x'型はありませんが、' '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またはimmutableまたはbitstypeではなく)型がabstractで宣言されたかどうかがわかりますタイプファミリー(Type)のプロパティです。これは、家族のメンバーの中にはサブタイプを宣言することができるかどうかを示しているため、リーフタイプや具体的なタイプとは直接関係しません。あなたが観察しているように、Type{Int}.abstractは真ですが、逆の例は、自体がリーフでもコンクリートでもないため、Complex.abstractはfalseです。これは、パラメータが指定されていないためです。