Julia 既然合子不支持突变,那么复发是如何避免的呢?

Julia 既然合子不支持突变,那么复发是如何避免的呢?,julia,Julia,来自Flux.jl的源代码: 它看起来像是用于每个递归层的Recurstruct,在向前传递中对其state字段进行变异。但是Zygote.jl不支持突变,所以为什么不抛出类似于错误的东西:不支持突变在这种情况下通常是这样的吗 关于出现这种情况的上下文:我正在实现我的自定义有状态层。最初,我只是将MyCustomRecurrentCell定义为RNNCell,并依赖recurrentcell处理MyCustomRecurrentCell的状态突变,就像RNNCell一样。但是后来我发现,因为Re

来自Flux.jl的源代码:

它看起来像是用于每个递归层的
Recur
struct,在向前传递中对其
state
字段进行变异。但是Zygote.jl不支持突变,所以为什么不抛出类似于
错误的东西:不支持突变在这种情况下通常是这样的吗

关于出现这种情况的上下文:我正在实现我的自定义有状态层。最初,我只是将
MyCustomRecurrentCell
定义为
RNNCell
,并依赖
recurrentcell
处理
MyCustomRecurrentCell
的状态突变,就像
RNNCell
一样。但是后来我发现,因为
Recur
的字段没有类型注释,所以我得到了我的状态的
Any
类型输出,它正在传播到所有其他层,因此我到处都得到
Any
。然后我归档并决定使用带有类型注释的字段重新实现
Recur
。当我这样做的时候,我现在得到了类似于
ArgumentError:type没有确定数量的字段
error。所以我想知道,
Recur
是如何摆脱变异状态的

mutable struct Recur{T}
  cell::T
  init
  state
end

Recur(m, h = hidden(m)) = Recur(m, h, h)

function (m::Recur)(xs...)
  h, y = m.cell(m.state, xs...)
  m.state = h
  return y
end