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)
但这也不起作用.
如何将参数类型指定为数组数组?
给定一组数组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)
什么是T和N为x?显然,有没有这样的N -这是两个 1和2!而这些子阵列的元素不是类型Any- 它们都是 Int和Float64.这同样适用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,如Real或Int.目前没有办法表明类型参数必须是超出约定的类型的值Int,N是一个整数).
| 归档时间: |
|
| 查看次数: |
145 次 |
| 最近记录: |