質問

以下を書きました

[<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)

コンパイラエラーが発生しますが、メジャーユニットが正しく表現されていると確信しています。私の間違いは何ですか?

役に立ちましたか?

解決

返品タイプを指定するために使用しようとした構文は正しくありませんでした。このように見えるはずです:

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>. 。パラメーターにタイプアノテーションを追加する場合、これらを括弧で囲む必要があります(したがって、構文はあいまいではありません)。コメントでパオロが指摘したように、あなたの使用 -> そう言っていました dt アノテーションのため、関数です float<s> -> Vector3<m> パラメーターに添付されました dt.

コードをコンパイルするには、の実装も追加する必要がありました (+) あなたへのオペレーター Vector3, 、しかし、私はあなたがすでにそれを持っていると思います(そして、質問を投稿するときにそれを残しました)。

他のヒント

私はこのように解決しました(しかし、理由についてはわかりません)。

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

返品タイプを明示的に定義すると、コンパイラが失敗するようです。とにかく正しいタイプを推測できるようです。しかし、なぜこれですか?

それに加えて、タイプ宣言の名前が衝突すると、返品タイプを明示的に指定するように強制される状況があります。ですから、これが最終的には正しい解決策ではないと思います。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top