首页 文章

矢量叉积中的类型不匹配

提问于
浏览
0

我需要在打字/球拍中做矢量交叉产品 . 以下代码在没有类型注释的 #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)

当我使用类型注释运行代码时,会发生类型不匹配错误 .

类型检查器:类型不匹配:给定的数字:任何在:(ref X 1)类型检查器:类型不匹配:给定的数字:任何在:(ref Y 2)类型检查器:类型不匹配:给定的数字:任何在: (ref X 2)类型检查器:预期类型不匹配:给定的数字:任何在:(ref Y 1)类型检查器:摘要:遇到4个错误:(ref X 1)(ref Y 2)(ref X 2)(ref Y 1)

它看起来像 (for/vector ([n len]) 触发错误,我尝试将类型注释放在 (for/vector ([{n: Integer} len]) 之类,但最终会出现错误:n中的未绑定标识符模块 . 我需要纠正什么?有没有更好的方法来做矢量交叉产品?

1 回答

  • 2

    第一个问题是 VectorTop . 这提供了几乎没有类型信息,所以你应该使用更准确的东西,如 (Vectorof Number) . 此外,根据经验,Typed Racket中的大多数表单都需要注释 . 最后, 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) .

相关问题