向量叉积中的类型不匹配
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)
.
我需要在 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)
.