Unités de mesure
Présentation
Moyen d'associer un type numérique à une unité de mesure
Durée :
sakasecondMasse :
kgLongueur :
makametre...
Les unités sont vérifiées à la compilation
Empêche d'ajouter des 🥦 à des 🥕 → code + sûr
Permet de les combiner : Vitesse = Distance / Durée →
m/s
Déclaration
Syntaxe basée sur attribut [<Measure>]
// 👉 Nouvelles unités "from scratch"
[<Measure>] type kilogram
[<Measure>] type metre
[<Measure>] type second
// 👉 Alias d'unités existantes
[<Measure>] type kg = kilogram
[<Measure>] type m = metre
[<Measure>] type s = second
// 👉 Combinaison d'unités existantes
[<Measure>] type Hz = / s
[<Measure>] type N = kg m / s^2SI
Les unités du Système International sont prédéfinies dans les namespaces :
FSharp.Data.UnitSystems.SI.UnitNames :
ampere,hertz,joule,kelvin,kilogram,metre...https://fsharp.github.io/fsharp-core-docs/reference/fsharp-data-unitsystems-si-unitnames.html
FSharp.Data.UnitSystems.SI.UnitSymbols
A,Hz,J,K,kg,m...https://fsharp.github.io/fsharp-core-docs/reference/fsharp-data-unitsystems-si-unitsymbols.html
Usage
Symbole
💡 Astuce : utilisation des doubles back ticks
Conversion
Facteur multiplicatif avec une unité
<target/source>Fonction de conversion utilisant ce facteur
Exemple 2 : degré Celsius (°C) → degré Fahrenheit (°F)
Ajouter/supprimer
Ajouter une unité à un nombre nu :
✅
number * 1.0<target>
Supprimer l'unité d'un nombre number : float<source> :
✅
number / 1.0<source>✅
float number
Créer une liste de nombres avec unité :
✅
[1<m>; 2<m>; 3<m>]❌
[1<m>..3<m>](un range nécessite des nombres nus)✅
[ for i in [1..3] -> i * 1<m> ]
Effacées au runtime !
Les unités de mesure sont propres au compilateur F♯. → Elles ne sont pas compilées en .NET
Type avec unité générique
Besoin de distinguer d'un type générique classique → Annoter l'unité générique avec [<Measure>]
Unité pour primitive non numérique
💡 Nuget FSharp.UMX (Unit of Measure Extension)
→ Pour autres primitives bool, DateTime, Guid, string, TimeSpan
Last updated
Was this helpful?