函数的1元素列表有一个奇怪的类型



我想创建一个函数向量。如果vector有多个元素,则可以正常工作:

[mean, sum]
2-element Vector{Function}:
mean (generic function with 95 methods)
sum (generic function with 30 methods)

这里的类型是Vector,元素类型是Function

但如果vector只有一个元素,则会发生以下情况:

[mean]
1-element Vector{typeof(mean)}:
mean (generic function with 95 methods)

突然变成元素类型为typeof(mean)Vector。这是一个错误,还是我不够聪明,不明白这一点?

Julia中的Function是一个抽象类型:

julia> isabstracttype(Function)
true

对于给定函数foo调用typeof(foo)返回一个具体类型:

julia> dump(typeof(mean))
typeof(mean) <: Function

由于typeof(foo)返回的是具体类型,因此可以得到以下类型的并集向量:

julia> Union{typeof(mean), typeof(sum)}[mean, sum]
2-element Vector{Union{typeof(sum), typeof(mean)}}:
mean (generic function with 8 methods)
sum (generic function with 20 methods)

这也意味着您可以创建这样的空Vector:

v = Vector{Union{typeof(mean), typeof(sum)}}()
Union{typeof(sum), typeof(mean)}[]

,现在你可以给它添加元素:

julia> push!(v,mean)
1-element Vector{Union{typeof(sum), typeof(mean)}}:
mean (generic function with 8 methods)
julia> push!(v,sum)
2-element Vector{Union{typeof(sum), typeof(mean)}}:
mean (generic function with 8 methods)
sum (generic function with 20 methods)

当你只做[mean, sum]时,Julia试图找到一个同时捕获typeof(mean)typeof(sum)的类型,你最终得到抽象的Function类型。

对于一个函数,我们说mean,它的类型只是typeof(mean),故事就结束了。因此,当矢量中只有mean时,Julia会尝试使用最特定的类型。当你有两个不同的函数时,除了抽象类型Function之外,没有其他更常见的类型了,因此Julia会退回到这个类型。

类似于:


julia> [1]
1-element Vector{Int64}:
1
julia> [1, "blah"]
2-element Vector{Any}:
1
"blah"

您可以创建空Vector{Function}并将函数压入其中,或者追加!另一个指向它的函数向量:

using Statistics
funcs  = Vector{Function}()
push!(funcs, mean)
push!(funcs, sum)
append!(funcs, [minimum, maximum])
println(funcs)

相关内容

  • 没有找到相关文章

最新更新