如何在Julia中使用数组和参数NTuple的并集作为函数参数类型?

时间:2018-06-02 09:17:44

标签: arrays julia

我正在尝试编写一个带有可以是元组或数组的参数的函数。这适用于例如:

julia> temp(x::Union{Vector{Int64},NTuple{4,Int64}}) = sum(x)
temp (generic function with 1 method)

julia> temp((3,1,5,4))
13

julia> temp([3,1,5,4])
13

另一方面,当我尝试使用未指定长度的元组时,它对于数组失败:

julia> temp(x::Union{Vector{Int64},NTuple{N,Int64}}) where N = sum(x)
temp (generic function with 1 method)

julia> temp([3,1,5,4])
ERROR: MethodError: no method matching temp(::Array{Int64,1})
Closest candidates are:
  temp(::Union{Array{Int64,1}, Tuple{Vararg{Int64,N}}}) where N at REPL[1]:1

julia> temp((3,1,5,4))
13

这不是做事的方式吗?我意识到我可以使用多个调度来解决这个问题:

julia> temp(x::Vector{Int64}) = sum(x)
temp (generic function with 1 method)

julia> temp(x::NTuple{N,Int64}) where N = sum(x)
temp (generic function with 2 methods)

julia> temp((3,1,5,4))
13

julia> temp([3,1,5,4])
13

但我想了解Union在julia中是如何运作的,并想知道是否有办法用它实现这一目标。

1 个答案:

答案 0 :(得分:4)

Julia 0.6.3和Julia 0.7-alpha之间的行为不同。我们在Julia 0.7-alpha中的含义更加一致,因为在这种情况下where子句的位置无关紧要。

Julia案例0.6.3

有两种方法可以通过在函数定义中移动where子句来解决问题:

julia> temp1(x::Union{Vector{Int64},NTuple{N,Int64}} where N) = sum(x)
temp1 (generic function with 1 method)

julia> temp1([3,1,5,4])
13

julia> temp1((3,1,5,4))
13

julia> temp2(x::Union{Vector{Int64},NTuple{N,Int64} where N}) = sum(x)
temp2 (generic function with 1 method)

julia> temp2([3,1,5,4])
13

julia> temp2((3,1,5,4))
13

您也可以避免使用where N这样指定Vararg

julia> temp3(x::Union{Vector{Int64}, Tuple{Vararg{Int64}}}) = sum(x)
temp3 (generic function with 1 method)

julia> temp3((3,1,5,4))
13

julia> temp3([3,1,5,4])
13

Julia 0.7-alpha

的案例

您的功能将起作用:

julia> temp(x::Union{Vector{Int64},NTuple{N,Int64}}) where N = sum(x)
temp (generic function with 1 method)

julia> temp([3,1,5,4])
13

julia> temp((3,1,5,4))
13

temp1temp2temp3也可以。