Racket struct error: given value instantiates a different structure type with the same name

Racket struct error: given value instantiates a different structure type with the same name

我非常熟悉 Racket,以及 Scheme 和 Lisp 家族中的许多人,但我不知道这个错误是怎么回事,或者是什么导致了它:

network-biases: contract violation;
 given value instantiates a different structure type with the same name
  expected: network?
  given: (network ...) <-- I omitted this because its useless.

这是错误所在的函数(其余的我有 gist):

(define (update-mini-batch net mini-batch eta)
  (define nabla-b (map (lambda (b)
             (apply grid (shape b))) (network-biases net)))
  (define nabla-w (map (lambda (w)
             (apply grid (shape w))) (network-weights net)))

  (define-values (nabla-b-new nabla-w-new)
    (foldl (lambda (lst bw)
       (define x (first lst))
       (define y (second lst))
       (define-values (nabla-b nabla-w) bw)
       (define-values (delta-nabla-b delta-nabla-w) (backprop net x y))

       (define nabla-b-new (+/ nabla-b delta-nabla-b))
       (define nabla-w-new (+/ nabla-w delta-nabla-w))
       (values nabla-b-new nabla-w-new)) (values nabla-b nabla-w) mini-batch))

  (struct-copy network net
           [biases (map (lambda (b nb)
                  (- b (* nb (/ eta (length mini-batch)))))
                (network-biases net) nabla-b-new)]
           [weights (map (lambda (w nw)
                   (- w (* nw (/ eta (length mini-batch)))))
                 (network-weights net) nabla-w-new)]))

我无法获得实际抛出错误的 MCVE,所以我没有提供。

我在上述函数中尝试做的提炼基础是这样的:

- 谢谢!!

Racket 中的结构是生成的。这意味着每次

(struct network (num-layers sizes biases weights) #:transparent)

是运行,创建了一种新型结构。这些都是命名网络。

您看到的错误消息通常是由于对结构定义进行了两次计算(这有点令人困惑,因为这两种类型具有相同的名称)。

我在您的代码中看不到任何可能导致 (struct network ...) 被 运行 两次的地方。您使用的是 DrRacket 还是不重置命名空间的替代环境?

如果我打开 "nn.rkt" 和 运行,我会看到错误吗?