F# est une des unités de mesure de capacité (il n'y a plus de détails dans ce document de recherche).
[<Measure>] type unit-name [ = measure ]
Cela permet aux unités d'être définie comme:
type [<Measure>] USD
type [<Measure>] EUR
Et le code pour être écrite comme suit:
let dollars = 25.0<USD>
let euros = 25.0<EUR>
// Results in an error as the units differ
if dollars > euros then printfn "Greater!"
Il gère aussi les conversions (je suppose que les moyens de Mesure a certaines fonctions définies qui permettent des Mesures soient multipliés, divisé et exponentiated):
// Mass, grams.
[<Measure>] type g
// Mass, kilograms.
[<Measure>] type kg
let gramsPerKilogram : float<g kg^-1> = 1000.0<g/kg>
let convertGramsToKilograms (x : float<g>) = x / gramsPerKilogram
Pourrait cette capacité d'être mis en œuvre en OCaml? Quelqu'un a suggéré que je regarde types fantômes, mais ils n'apparaissent pas à composer de la même manière que les unités.
(Divulgation: j'ai posé cette question à propos de Haskell il y a quelques mois, a eu une discussion intéressante à ce sujet mais pas de réponse définitive au-delà de "probablement pas").