Dictionary 在Julia中检查复杂类型时未指定

Dictionary 在Julia中检查复杂类型时未指定,dictionary,types,tuples,julia,typechecking,Dictionary,Types,Tuples,Julia,Typechecking,给定一些复杂对象,例如: > d = Dict(("a", "b")=>3, ("c", "d")=>2) Dict{Tuple{String,String},Int64} with 2 entries: ("c","d") => 2 ("a","b") => 3 我可以通过以下方式检查类型: > isa(d, Dict{Tuple{String, String},Int64}) true 但当我未充分指定元组类型时,检查失败: > isa(

给定一些复杂对象,例如:

> d = Dict(("a", "b")=>3, ("c", "d")=>2)
Dict{Tuple{String,String},Int64} with 2 entries:
  ("c","d") => 2
  ("a","b") => 3
我可以通过以下方式检查类型:

> isa(d, Dict{Tuple{String, String},Int64})
true
但当我未充分指定元组类型时,检查失败:

> isa(d, Dict{Tuple,Int64})
false

是否可以在Julia中检查未指定的类型?如果是,怎么做?如果没有,原因是什么?

在Julia中,字典和数组一样是不变的。例如,请参见适用于阵列的概念

这意味着:

julia> Int <: Number
true
在你提供的代码中

julia> isa(d, Dict)
true
据我所知,如果你想在你的字典中明确地解释这对类型,你需要明确地引用它们。您可以使用keytyped和valtyped来执行此操作。例如,从您的问题中,请注意

julia> keytype(d) <: Tuple
true
当然,如果您的字典被传递到一个函数中,那么您可以在函数签名中使用Dict{T1,T2},然后对T1和T2进行推理


编辑:请参阅@FengyangWang的答案,了解v0.6中引入的一个简洁的语法快捷方式

isa(d, Dict{<:Tuple, Int64})
这意味着一个Dict,其键类型为Tuple的子类型,值类型为Int64

注意,Dict{Tuple,Int64}不是未指定的类型:它是一个具体类型,可以有实例。然而,Dict{Tuple{String,String},Int64}不是一回事。前者接受所有元组作为键,而后者只接受元组{String,String}。这是一个参数不变性的例子

julia> isa(d, Dict)
true
julia> keytype(d) <: Tuple
true
isa(d, Dict{<:Tuple, Int64})