具有通用函数成员的结构数组?

Array of structs with generic function members?

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

这是一个例子:

struct mystruc{F}
    σ::F
end

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

附带说明一下,我可以选择预分配数组,我只是不知道如何处理这种类型的结构。

每个函数都有一个类型,它是那个函数独有的:

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 该数组将包含 mystrucany 函数:

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"())