1

私は次のことを書きました

[<Measure>]
type m

[<Measure>]
type s

[<Measure>]
type v = m/s

type Vector3<[<Measure>] 'a> =
    {
    X : float<'a>
    Y : float<'a>
    Z : float<'a>
    }
    static member (*)
        (v:Vector3<'a>,f:float<'b>):Vector3<'a*'b> =
        { X = v.X*f; Y = v.Y*f ; Z = v.Z * f}

今、私はこのように使用しようとしています:

let next_pos (position:Vector3<m> , velocity: Vector3<m/s> ,dt : float<s>  ->  Vector3<m>) =
     position + (velocity * dt)

コンパイルエラーが発生しますが、測定単位が正しく表現されていると確信しています。私の間違いは何ですか?

4

2 に答える 2

3

戻り型を指定するために使用しようとした構文が正しくありませんでした。次のようになります。

let next_pos (position:Vector3<m>, velocity:Vector3<m/s>, dt:float<s>) : Vector3<m> = 
  position + (velocity * dt) 

関数がタイプの値を返すように指定するにはVector3<m>、結果にタイプアノテーションを追加する必要があります。これは、を記述することによって行われますlet foo <arguments> : T = <expr>。パラメータに型注釈を追加するときは、これらを括弧で囲む必要があります(構文があいまいにならないようにするため)。Paoloがコメントで指摘したように、注釈がパラメーターに付加されているため、の使用はそれが関数である->と言っていました。dtfloat<s> -> Vector3<m>dt

コードをコンパイルするために、(+)演算子の実装も追加Vector3する必要がありましたが、すでにそれがあると思います(そして、質問を投稿するときに省略しました)。

于 2011-11-29T11:44:31.033 に答える
1

私はこの方法で解決しました(ただし、理由はわかりません)。

let next_pos (position:Vector3<m> , velocity: Vector3<m/s> ,dt : float<s> ) =
     position + (velocity * dt)

戻り値の型を明示的に定義すると、コンパイラが失敗するようです。削除すると、とにかく正しいタイプを推測できるようです。しかし、これはなぜですか?

それに加えて、型宣言での名前の衝突により、戻り値の型を明示的に指定せざるを得ない状況があります。したがって、これが最終的に正しい解決策であるとは思いません。

于 2011-11-29T11:27:31.763 に答える