Julia:接受多种数组类型的模板函数

use*_*504 0 arrays templates function julia type-promotion

我试图在使用该Array类型的同时保持代码的可重用性,但不确定如何在不允许“非法”类型通过的情况下继续进行。示例功能:

foo = function(x::Array{Number,2})
    print(x)
end

foo([1 2 3; 4 5 6; 7 8 9])
# 15

foo([1 2 3])
# MethodError: no method matching (::Array{Int64,1})
# Closest candidate is (::Array{Number,2})

foo(["alpha" "beta"; "pi" "rho"])
# MethodError: no method matching (::Array{String,2})
# Closest candidate is (::Array{Number,2})
Run Code Online (Sandbox Code Playgroud)

然而,第一个例子尽管理论上是有效的促销,但foo([1 2 3; 4 5 6; 7 8 9])还是回来了。我不想为每个函数调用手动转换;我也不想必须将所有数组声明为该类型。我知道我可以将函数调用替换为:MethodError: no method matching (::Array{Int64,2})(::Array{Number,2})Array{Number,2}

foo = function(x::Array)
    print(x)
end
Run Code Online (Sandbox Code Playgroud)

但是,这允许将任何维度和类型的数组放入函数中。我能想到的唯一的其他选择是添加样板代码,我最初允许任何和所有数组进入,手动检查它们的类型和大小,然后从那里开始,但这感觉不优雅。

有什么建议么?提前致谢。(注:我使用的是 Julia 0.6.3)

Bog*_*ski 5

使用Matrix{<:Number}而不是Array{Number, 2}作为类型限制,一切都将起作用(也Array{<:Number, 2}将起作用)。

简而言之Matrix{Int64},不是 的子类型Matrix{Number},而是 的子类型Matrix{T} where {T<:Number},可以表示为Matrix{<:Number}如果您不在T函数体内使用的话。

Julia 手册在这里https://docs.julialang.org/en/v0.6.4/manual/types/#Parametric-Abstract-Types-1和这里https://docs.julialang.org/en/v0.6.4/ Manual/methods/#Parametric-Methods-1详细描述了参数类型中的子类型在 Julia 0.6 中的工作原理。然后我认为您可以查看最近的 SO 问题Julia:为具有缺失值的任何向量创建一个方法,以了解如何处理更复杂的子类型情况。