数组打破 Julia 中的字符串类型

Arrays break string types in Julia

下面是设计的吗?

ASCIIString <: Stringreturnstrue,但是Array{ASCIIString,1} <: Array{String,1}returnsfalse.

也许这是一个错误,我应该在 github 上提出拉取请求。 (我是 运行 v0.4.0-dev+6210)

只需将我的评论转换为答案即可:

你的问题的答案是肯定的。正如朱莉娅的 document 所说:

in the parlance of type theory, Julia’s type parameters are invariant, rather than being covariant (or even contravariant).

在下面的误导性案例中,人们可能会发现

julia> Int64 <: Int
true

julia> Array{Int64,1} <: Array{Int,1}
true

这是因为IntInt64是同一类型。

julia> xdump(Int)
Int64::DataType  <: Signed

julia> xdump(Int64)
Int64::DataType  <: Signed

julia> xdump(Array{Int,1})
Array{Int64,1}::DataType  <: DenseArray{Int64,1}

julia> xdump(Array{Int64,1})
Array{Int64,1}::DataType  <: DenseArray{Int64,1}

我们可以使用typejoin来检查类型A和类型B之间的关系以及它们对应的"arrays"。

julia> typejoin(Int64,Int)
Int64

julia> typejoin(Array{Int64,1},Array{Int,1})
Array{Int64,1}

但是

julia> typejoin(ASCIIString,String)
String

julia> typejoin(Array{String,1},Array{ASCIIString,1})
Array{T,N} (constructor with 9 methods)