Domanda

ho scritto il seguente

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

Ora sto cercando di usare in questo modo:

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

Mi dà un errore di compilazione, ma sono abbastanza sicuro che l'unità di misura sono espressi a destra. Qual è il mio errore?

È stato utile?

Soluzione

La sintassi si è tentato di utilizzare per specificare il tipo di ritorno non era corretto. Esso dovrebbe essere simile a questo:

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

Per specificare che la funzione restituisce un valore di tipo Vector3<m>, è necessario aggiungere tipo di annotazione al risultato, che è fatto scrivendo let foo <arguments> : T = <expr>. Quando si aggiungono annotazioni di tipo ai parametri, questi devono essere racchiusa tra parentesi (quindi la sintassi non è ambigua). Come notato da Paolo in un commento, l'utilizzo del -> stava dicendo che dt è una funzione, perché il float<s> -> Vector3<m> di annotazione è stata allegata al parametro dt.

Per rendere il codice di compilazione, ho avuto anche aggiungere un'implementazione dell'operatore (+) al vostro Vector3, ma suppongo avete già (e appena lasciato fuori quando la pubblicazione della domanda).

Altri suggerimenti

ho risolto in questo modo (ma non sono sicuro circa il motivo).

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

Sembra che il compilatore non riesce se io explicetly definisco il tipo di ritorno. Se rimuovo sembra in grado di dedurre il tipo corretto in ogni caso. Ma perché questo?

In aggiunta a ciò, ci sono situazioni in cui il nome scontri in vigore tipo di dichiarazione me per specificare explictely il tipo di ritorno. Quindi non credo che questa sia la soluzione giusta alla fine.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top