ベクタークロスプロダクトをタイプ/ラケットで行う必要があります。次のコードは、型の注釈なしで#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)
私は型注釈を使用してコードを実行し、型の不一致エラーが発生します。 (for/vector ([n len])
がエラーをトリガと同様に
- 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: Integer} len])
のように型注釈を入れてみましたが、それはエラーで終わる:Nで結合していない識別子モジュール。修正するために何が必要ですか?ベクタークロスプロダクトを行うためのより良い方法がいくつかありますか?
私はlike(Vector Real Real Real)のように変換しようとしましたが、Vectorがバインドされていない識別子であることを示すエラーがあります。 – Toat
@Toatなぜこれが起こるのか分かりません。 '(定義型R3-Vec(ベクトル実数実数))'が動作するはずです。 – Gibstick