Unités de mesure

Présentation

Moyen d'associer un type numérique à une unité de mesure

  • Durée : s aka second

  • Masse : kg

  • Longueur : m aka metre

  • ...

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^2

SI

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

Mis à jour

Ce contenu vous a-t-il été utile ?