在 julia 0.4 中工作的匿名函数数组,而不是在 0.5.1 中
Array of anonymous functions working in julia 0.4, not in 0.5.1
我正在将一些代码从 Julia 0.4.7 移植到 0.5.1。我注意到有些东西与匿名函数数组不兼容。代码在这里:
f = x::Array{Function} -> size(x)
# Option 1
f([k -> k+1, k-> k+1]) # This works in 0.4 & 0.5
# Option 2
f(repmat([k -> k+1], 2)) # This only works in 0.4
据我所知,区别在于虽然在 0.4 中匿名数组在内部仍被视为 Array{Function, 1},但在 0.5 中它被视为 Array{#11#12, 1}(数字可能会改变),然后它会引发 MethodError 因此它们不匹配。
虽然这个例子很愚蠢,但它显示了我真正需要的东西:复制一个匿名函数的次数可变。
谢谢!
在 Julia 0.5+ 中,Function
becomes an abstract type,所以 Array{Function}
是一个参数类型,它是 不变的。
julia> typeof(x -> 2x)
##1#2
julia> typeof(x -> 2x) <: Function
true
julia> typeof([x -> 2x]) <: Array{Function}
false
因此,定义f
的正确方法是:
f{T<:Function}(x::Array{T}) = size(x)
julia> f(repmat([k -> k+1], 2))
(2,)
我正在将一些代码从 Julia 0.4.7 移植到 0.5.1。我注意到有些东西与匿名函数数组不兼容。代码在这里:
f = x::Array{Function} -> size(x)
# Option 1
f([k -> k+1, k-> k+1]) # This works in 0.4 & 0.5
# Option 2
f(repmat([k -> k+1], 2)) # This only works in 0.4
据我所知,区别在于虽然在 0.4 中匿名数组在内部仍被视为 Array{Function, 1},但在 0.5 中它被视为 Array{#11#12, 1}(数字可能会改变),然后它会引发 MethodError 因此它们不匹配。
虽然这个例子很愚蠢,但它显示了我真正需要的东西:复制一个匿名函数的次数可变。
谢谢!
在 Julia 0.5+ 中,Function
becomes an abstract type,所以 Array{Function}
是一个参数类型,它是 不变的。
julia> typeof(x -> 2x)
##1#2
julia> typeof(x -> 2x) <: Function
true
julia> typeof([x -> 2x]) <: Array{Function}
false
因此,定义f
的正确方法是:
f{T<:Function}(x::Array{T}) = size(x)
julia> f(repmat([k -> k+1], 2))
(2,)