F # имеет единицы измерения меры (более подробно в этом исследовательском документе).
[<Measure>] type unit-name [ = measure ]
Это позволяет определять единицы измерения, такие как:
type [<Measure>] USD
type [<Measure>] EUR
И код, который будет записан как:
let dollars = 25.0<USD>
let euros = 25.0<EUR>
// Results in an error as the units differ
if dollars > euros then printfn "Greater!"
Он также обрабатывает конверсии (я предполагаю, что означает, что "Мера" имеет определенные функции, которые позволяют умножать, делить и экспонировать Меры):
// 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
Может ли эта возможность быть реализована в OCaml? Кто-то предложил мне посмотреть на типы phantom, но они, похоже, не составлены так же, как единицы.
(Раскрытие информации: Я задал этот вопрос о Хаскелле несколько месяцев назад, получил интересную дискуссию, но окончательный ответ не был "вероятно, нет" ).