F# Garantire le unità coerenti nei calcoli


Esempio

Le unità di misura sono ulteriori annotazioni di tipo che possono essere aggiunte a float o interi. Possono essere utilizzati per verificare in fase di compilazione che i calcoli utilizzano le unità in modo coerente.

Per definire annotazioni:

[<Measure>] type m // meters
[<Measure>] type s // seconds
[<Measure>] type accel = m/s^2 // acceleration defined as meters per second squared

Una volta definite, è possibile utilizzare annotazioni per verificare che un'espressione produca il tipo previsto.

// Compile-time checking that this function will return meters, since (m/s^2) * (s^2) -> m
// Therefore we know units were used properly in the calculation.
let freeFallDistance (time:float<s>) : float<m> = 
    0.5 * 9.8<accel> * (time*time)    

// It is also made explicit at the call site, so we know that the parameter passed should be in seconds
let dist:float<m> = freeFallDistance 3.0<s>
printfn "%f" dist