具有泛型函数成员的结构数组?

时间:2020-09-11 15:16:43

标签: julia flux

我正在尝试构造一个结构数组,其中每个实例包含一个不同的函数。我想将它们循环添加到数组中。

这是一个例子:

struct mystruc{F}
    σ::F
end

a = [mystruc(relu)]
for i in 1:3
 append!(a, [mystruc(identity), ])
end

作为旁注,我可以选择预分配我无法弄清楚如何使用这种类型的结构的数组。

1 个答案:

答案 0 :(得分:4)

每个函数都有一个类型,该类型是那个函数专有的:

julia> typeof(x -> x) == typeof(x -> x)
false

这里我们两次创建了函数x -> x,它们是两个不同的函数,因此它们的类型不同。

a的构造中,您将创建一个特定类型的数组:

julia> a = [mystruc(relu)]
1-element Array{mystruc{typeof(relu)},1}:
 mystruc{typeof(relu)}(relu)

julia> typeof(a)
Array{mystruc{typeof(relu)},1}

因此,当您按下另一个函数时,会出现错误,因为此数组只能包含类型为mystruc{typeof(relu)}的对象。

julia> push!(a, mystruc(x -> 2x))
ERROR: MethodError: Cannot `convert` an object of type
  mystruc{var"#3#4"} to an object of type
  mystruc{typeof(relu)}
Closest candidates are:
  convert(::Type{T}, ::T) where T at essentials.jl:171
  mystruc{typeof(relu)}(::Any) where F at REPL[2]:2

解决方案

构造a时,请告诉Julia使用 any 函数的数组将包含mystruc

julia> a = mystruc{<:Function}[mystruc(relu)]

现在可以使用了!

julia> push!(a, mystruc(x -> 2x))
2-element Array{mystruc{#s1} where #s1<:Function,1}:
 mystruc{typeof(relu)}(relu)
 mystruc{var"#5#6"}(var"#5#6"())