向量交叉积

时间:2016-11-21 03:47:01

标签: vector racket typed-racket cross-product

我需要在打字/球拍中做矢量交叉产品。以下代码在#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个错误:
      (参考X 1)
      (参考2)
      (参考X 2)
      (参考Y 1)
  •   

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

1 个答案:

答案 0 :(得分:2)

第一个问题是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)