向量叉积中的类型不匹配

Type mismatch in vector cross product

我需要在 typed/racket 中做矢量叉积。以下代码在没有类型注释的 #lang racket 中运行良好。 reference

#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)

当我运行带有类型注解的代码时,出现类型不匹配的错误。

  • 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)

看起来像 (for/vector ([n len]) 触发了错误,我尝试像 (for/vector ([{n: Integer} len]) 那样放置类型注释,但它最终出现错误:n 中未绑定的标识符模块。我需要纠正什么?有没有更好的向量叉积方法?

第一个问题是 VectorTop。这几乎不提供任何类型信息,因此您应该使用更准确的内容,例如 (Vectorof Number)。此外,根据经验,Typed Racket 中的大多数 for 形式都需要注释。最后,Any 也没有提供太多类型信息,因此您也应该修复 ref 的类型。

更具体地说,您在当前代码中看到的类型错误是由于 ref 函数的类型不准确造成的。但一旦你解决了这个问题,你就会 运行 陷入上述其他问题。

以下代码类型检查。

#lang typed/racket

(: cross-product (-> (Vectorof Number) (Vectorof Number) (Vectorof Number)))
(define (cross-product X Y)
  (define len (vector-length X))
  (for/vector ([n len]) : Number
    (: ref (-> (Vectorof Number) Index Number))   
    (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 : (Vectorof Number) '#(0 1 0))
(define Y : (Vectorof Number) '#(0 0 -1))

(cross-product X Y)

如果您只需要 R^3 中向量的叉积,请考虑对公式进行硬编码而不是使用 for,并为 (Vector Real Real Real) 定义类型。我无法简单地将此程序转换为使用 (Vector Real Real Real).