【问题标题】:Underspecification when checking complex types in Julia在 Julia 中检查复杂类型时规范不足
【发布时间】:2017-04-26 01:17:48
【问题描述】:

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

> 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

但是当我未指定 Tuple 类型时,检查失败:

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

是否可以在 Julia 中检查未指定的类型?如果是这样,怎么做?如果不是,为什么?

【问题讨论】:

    标签: dictionary types tuples julia typechecking


    【解决方案1】:

    在 Julia 中,字典和数组一样是不变的。例如,请参阅this question 关于适用于数组的概念。

    这意味着:

    julia> Int <: Number
    true
    

    但是,

    julia> Vector{Int} <: Vector{Number}
    false
    

    同样,

    julia> Dict{Int, String} <: Dict{Number, String}
    false
    

    但是,请注意 Dict 本身是抽象的,所以

    julia> Dict{Int, String} <: Dict
    true
    

    在您提供的代码中,

    julia> isa(d, Dict)
    true
    

    据我所知,如果您想具体推理字典中的这对类型,则需要明确引用它们。您可以使用keytype(d)valtype(d) 执行此操作。例如,从您的问题中,请注意

    julia> keytype(d) <: Tuple
    true
    

    当然,如果你的字典传入一个函数,那么你可以在函数签名中使用Dict{T1, T2},然后就推理T1T2...

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

    【讨论】:

      【解决方案2】:

      在 Julia 0.6 中你可以简单地做

      isa(d, Dict{<:Tuple, Int64})
      

      这意味着Dict 的键类型是Tuple 的子类型,值类型是Int64

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-14
        • 2017-01-22
        • 1970-01-01
        • 2013-12-16
        • 2020-01-20
        • 2017-05-25
        相关资源
        最近更新 更多