Pertanyaan Julia: Perbedaan antara Jenis dan Tipe Data


Bagi saya, mereka tampaknya sama. Sejak Type adalah tipe DataType dan sebaliknya, bagaimana mereka tidak setara? Kapan saya harus menggunakan yang satu dibandingkan yang lain?

> isa(DataType, Type)
true

> typeof(Type)
DataType

> isa(Type, DataType)
true

> typeof(DataType)
DataType

7
2018-02-16 20:20


asal


Jawaban:


Type dan DataType sendiri merupakan dua tipe. Dan jenis yang paling banyak adalah, seperti yang Anda temukan, DataType. Pada kasus ini, DataType adalah subtipe dari abstrak Type:

julia> supertype(DataType)
Type{T}

julia> supertype(Type)
Any

julia> DataType <: Type
true

Artinya apa pun itu isa  DataType juga akan menjadi Type - begitu banyak tipe di Julia adalah  isa kedua. Ada juga subtipe lainnya Type, termasuk Unions dan TypeConstructors. Ini artinya itu semua jenis di julia akan menjadi tipe Type, tetapi bahkan hal-hal sederhana seperti Vector tidak akan bertipe DataType.

Type spesial. Seperti yang Anda lihat di atas, ini adalah parametrik. Ini memungkinkan Anda untuk secara tepat menentukan tipe dari tipe spesifik yang dimaksud. Jadi sementara setiap tipe tunggal di Julia isa  Type, saja Int  isa  Type{Int}:

julia> isa(Int, Type{Int})
true

julia> isa(Float64, Type{Int})
false

julia> isa(Float64, Type)
true

Kemampuan ini spesial dan unik untuk Type, dan penting untuk memungkinkan pengiriman ditentukan pada jenis tertentu. Misalnya, banyak fungsi memungkinkan Anda menentukan jenis sebagai argumen pertama mereka.

f(x::Type{String}) = "string method, got $x"
f(x::Type{Number}) = "number method, got $x"

julia> f(String)
"string method, got String"

julia> f(Number)
"number method, got Number"

Ini perlu diperhatikan Type{Number} aku s hanya tipe dari Number, dan bukan tipe Int, meskipun Int <: Number! Ini adalah invarian parametrik. Untuk mengizinkan semua subtipe dari jenis abstrak tertentu, Anda dapat menggunakan parameter fungsi:

julia> f(Int)
ERROR: MethodError: no method matching f(::Type{Int64})

julia> f{T<:Integer}(::Type{T}) = "integer method, got $T"
f (generic function with 3 methods)

julia> f(Int)
"integer method, got Int64"

Kemampuan untuk menangkap tipe spesifik yang dipertanyakan sebagai parameter fungsi sangat kuat dan sering digunakan. Perhatikan bahwa saya bahkan tidak perlu menentukan nama argumen - satu-satunya hal yang penting dalam hal ini adalah parameter di dalamnya Type{}.


Jadi itu penjelasan yang cukup panjang untuk apa yang benar-benar jawaban yang cukup singkat: Anda biasanya tidak ingin menggunakannya DataType, karena tidak akan mencakup semua jenis di Julia. Sebaliknya, Anda harus menggunakannya Type untuk mendeskripsikan tipe dari setiap atau semua jenis. Menggunakan Type{T} ketika Anda ingin menggambarkan jenis T khususnya.


6
2018-02-16 23:41