J'ai besoin de faire un produit vectoriel croisé en typé/raquette. Le code suivant fonctionne correctement dans #lang racket
sans annotations de type. referenceIncompatibilité de type produit vectoriel croisé
#lang typed/racket
(: cross-product (-> VectorTop VectorTop VectorTop))
(define (cross-product X Y)
(: len Integer)
(define len (vector-length X))
(for/vector ([n len])
(: ref (-> VectorTop Integer Any))
(define (ref V i) (vector-ref V (modulo (+ n i) len)))
(- (* (ref X 1) (ref Y 2)) (* (ref X 2) (ref Y 1)))))
(define X '#(0 1 0))
(define Y '#(0 0 -1))
(cross-product X Y)
Quand je lance le code avec des annotations de type, erreur d'incompatibilité de type se produit.
- Type Checker: type mismatch
expected: Number
given: Any in: (ref X 1)- Type Checker: type mismatch
expected: Number
given: Any in: (ref Y 2)- Type Checker: type mismatch
expected: Number
given: Any in: (ref X 2)- Type Checker: type mismatch
expected: Number
given: Any in: (ref Y 1)- Type Checker: Summary: 4 errors encountered in:
(ref X 1)
(ref Y 2)
(ref X 2)
(ref Y 1)
Il ressemble à (for/vector ([n len])
déclenche l'erreur, j'ai essayé de mettre l'annotation de type comme (for/vector ([{n: Integer} len])
, mais il se termine avec l'erreur: le module d'identification non liée n. De quoi ai-je besoin pour corriger? Existe-t-il de meilleurs moyens de faire des produits vectoriels croisés?
J'ai essayé de convertir comme (Vector Real Real Real), mais il y a une erreur montrant que Vector est un identifiant non lié. – Toat
@Toat Je ne sais pas pourquoi cela arriverait. '(définir-type R3-Vec (Vector Real Real Real))' devrait fonctionner. – Gibstick