如何在不限制其尺寸的情况下为函数参数指定类型?

Ste*_*nna 5 arrays types multiple-dispatch julia

在Julia中,我想将函数参数的类型指定为数组数组.所以我有

function foo{T <: Any}(x::Array{Array{T}})
Run Code Online (Sandbox Code Playgroud)

但是如果我x在REPL中设置参数,例如:

x = Array[[0,1],[1,2,3],[0,1,2,4]]
Run Code Online (Sandbox Code Playgroud)

然后它会自动获取以下类型赋值(例如),其中包括其尺寸:

x::Array{Array{T,N},1}
Run Code Online (Sandbox Code Playgroud)

所以我得到了错误

ERROR: `foo` has no method matching foo(::Array{Array{T,N},1}).
Run Code Online (Sandbox Code Playgroud)

我根本不想限制数组维度,因此我们认为解决方案可能就是这样

function foo{T <: Any, N <: Number}(x::Array{Array{T,N},N})
Run Code Online (Sandbox Code Playgroud)

但这也不起作用.

如何将参数类型指定为数组数组?

Mat*_* B. 7

给定一组数组x = Array[isodd(i) ? [1i,2i] : [1.0i 2.0i] for i=1:10],Julia将其类型报告为Array{Array{T,N},1}.这是欺骗性的,因为它似乎意味着存在上述类型将匹配的一些T和一些N.但情况并非如此:奇数元素将是类型Array{Int,1},而均衡元素将是Array{Float64,2}.因此,当您尝试foo使用类型参数编写方法时:

foo{T,N}(::Array{Array{T,N},1}) = T,N
Run Code Online (Sandbox Code Playgroud)

什么是TNx?显然,有没有这样的N -这是两个 1和2!而这些子阵列的元素不是类型Any- 它们都是 IntFloat64.这同样适用Array[[0,1],[0,1,2]],即使在你的例子中你知道T并且N是一致的,Julia的类型系统也不会......并且你可能会推送不是Int向量的元素.

围绕这个有很多方法.最好的方法是尝试确保您的数组始终具有具体(或至少是统一的)元素类型,但这并不总是可行的.鉴于x上面的例子,你可以写:x = Array{Int,1}[[0,1],[1,2,3],[0,1,2,4]].

另一种方法是更改​​功能签名:

foo{N}(x::Array{Array,N}) = 1 # Will *only* work for arrays like x above
foo{T<:Array, N}(x::Array{T,N} = 2 # Will work for all arrays of arrays
Run Code Online (Sandbox Code Playgroud)

第一个仅适用于由于不变性而具有该类型的情况,而第二个适用于所有阵列数组,包括类型差和具体的数组.

(编辑:作为最后一个注释,N<:Number将不匹配文字数字.它将匹配类型的类型Number,如RealInt.目前没有办法表明类型参数必须是超出约定的类型的Int,N是一个整数).