單位之間的轉換

[<Measure>] type m // meters
[<Measure>] type cm // centimeters

// Conversion factor
let cmInM = 100<cm/m>

let distanceInM = 1<m>
let distanceInCM = distanceInM * cmInM // 100<cm>

// Conversion function
let cmToM (x : int<cm>) = x / 100<cm/m>
let mToCm (x : int<m>) = x * 100<cm/m>

cmToM 100<cm> // 1<m>
mToCm 1<m> // 100<cm>

請注意,F#編譯器不知道 1<m> 等於 100<cm>。就其而言,單位是單獨的型別。你可以編寫類似的函式來從米轉換為千克,編譯器也不會關心。

[<Measure>] type kg

// Valid code, invalid physics
let kgToM x = x / 100<kg/m>

不可能將度量單位定義為其他單位的倍數,例如

// Invalid code
[<Measure>] type m = 100<cm>

然而,為了定義單位每個東西,例如赫茲,測量頻率,簡單地說是每秒,非常簡單。

// Valid code
[<Measure>] type s
[<Measure>] type Hz = /s

1 / 1<s> = 1 <Hz> // Evaluates to true

[<Measure>] type N = kg m/s // Newtons, measuring force. Note lack of multiplication sign.

// Usage
let mass = 1<kg>
let distance = 1<m>
let time = 1<s>

let force = mass * distance / time // Evaluates to 1<kg m/s>
force = 1<N> // Evaluates to true