Pētot nedaudz vairāk F# valodas konstrukcijas uzdūros interesantai lietai, kas saucās – SI sistēmas mērvienību atbalsts uzreiz tieši jau pašā valodā. Šo mērvienību atbalsts tiek pasniegts tādā veidā, ka kompilācijas laikā tiek pārbaudītas dažādas formulas un izteiksmes un pēc labākās gribas FSharp kompilators mēģinās konkrēto izteiksmi pārbaudīt. Šīs pārbaudes notiek tikai kompilācijas laikā un nekādu ātrdarbības ietekmi uz izpildes laiku neatstāj.
Tātad, lai kodā sāktu lietot mērvienības ir jādefinē vēlamais tips un jānorāda tam, ka tas ir mērvienības tips. Izdarāms tas ir ar Measure atribūta palīdzību.
// type to represent weight (kilo)
[<Measure>] type kg
// type to represent distance (meter)
[<Measure>] type m
// type to represent time (second)
[<Measure>] type s
Pēc tam ir iespējams veidot jau konkrētās mērvienības instances datus. Piemēram, varam izveidot attāluma un laika mērvienības vērtības:
let distance = 100.0<m>
let time = 7.8<s>
Pēc tipu evaluācijas konsoles logs attēlo jaunos izveidotos tipus:
>
[<Measure>]
type kg
[<Measure>]
type m
[<Measure>]
type s
val distance : float<m> = 100.0
val time : float<s> = 7.8
Kad ir izveidoti gan tipi, gan arī mērvienības vērtības kodā var sākt rakstīt formulas un algoritmus, kas izmanto šīs mērvienības. Piemēram varam aprēķināt ātrumu kādā jābrauc kādai super-puper opel sporta astrīdai, lai nobrauktu 100m 7.8 sekundēs. Izklausās jau nereāli, bet testa piemēram būs pilnīgi pietiekoši.
let speed = (distance / time)
>
val speed : float<m/s> = 12.82051282
Kompilācijas laikā, piemēram, tiek arī pārbaudīts vai laiku un attālumu maz var saskaitīt.
Lai pārkonvertētu to daudz saprotamākā izteiksmē, jāatceras ir augstākā matemātika no 2. klasītes un jādefinē ir vairākas konvertēšanas konstantes:
// type to represent distance (kilometer)
[<Measure>] type km
// type to represent distance (hour)
[<Measure>] type h
let kmPerMeter = 0.001<km/m>
let secPerHour = 3600.0<s/h>
Pēc kad ir nodefinētas konstantes varam veikt konvertēšanu no metriem sekundē uz kilometriem stundā:
let speedKph = speed * kmPerMeter * secPerHour
>
val speedKph : float<km/h> = 46.15384615
Protams kompilators nenoķers programmētāja loģiskās kļūdas, bet ja tiek sajaukta kāda matemātiskā operācija (piemēram, reizināšanas vietā tiek dalīts), noteikti rezultāts būs ar jocīgu datu tipu:
> speed * kmPerMeter / secPerHour;;
val it : float<h km/s ^ 2> = 3.561253561e-06
Kā redzams, tad F# valodas iebūvētais atbalsts mērvienībām ir diezgan noderīgs gadījumos, kad tiešām ir jāveido formulas un jādod iespēja pārslēgties starp dažādām mērvienības sistēmām.
Cerams, ka noderēs!