Frage

Ich habe Folgendes geschrieben

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

Jetzt versuche ich es so zu verwenden:

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

Es gibt mir einen Compiler -Fehler, aber ich bin mir ziemlich sicher, dass die Maßeinheit richtig ausgedrückt ist. Was ist mein Fehler?

War es hilfreich?

Lösung

Die Syntax, die Sie zur Angabe des Rückgabetyps verwenden wollten, war falsch. Es sollte so aussehen:

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

Um anzugeben, dass die Funktion einen Wert des Typs zurückgibt Vector3<m>, Sie müssen dem Ergebnis Typanmerkungen hinzufügen, das durch Schreiben durchgeführt wird let foo <arguments> : T = <expr>. Beim Hinzufügen von Typ -Anmerkungen zu Parametern müssen diese untersammelt werden (so ist die Syntax nicht mehrdeutig). Wie von Paolo in einem Kommentar festgestellt -> sagte das dt ist eine Funktion, weil die Annotation float<s> -> Vector3<m> wurde am Parameter beigefügt dt.

Um den Code kompilieren zu lassen, musste ich auch eine Implementierung von hinzufügen (+) Bediener zu Ihrem Vector3, aber ich nehme an, Sie haben das bereits (und haben es einfach weggelassen, wenn Sie die Frage stellen).

Andere Tipps

Ich habe diesen Weg gelöst (aber ich bin mir nicht sicher über den Grund).

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

Es scheint, dass der Compiler fehlschlägt, wenn ich den Rückgabetyp explizit definiere. Wenn ich entferne, scheint es trotzdem in der Lage zu sein, den richtigen Typ zu schließen. Aber warum das?

Darüber hinaus gibt es Situationen, in denen mich der Namen in der Typ -Deklaration zusammenfasst, um den Rückgabetyp explizit anzugeben. Ich denke also nicht, dass dies am Ende die richtige Lösung ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top