我需要在打字/球拍中做矢量交叉产品。以下代码在#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中的未绑定标识符模块。我需要纠正什么?有没有更好的方法来做矢量交叉产品?
答案 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)
。