FSharp – mērvienību atbalsts

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!

Published Friday, March 19, 2010 6:13 PM by valdis.iljuconoks
Filed under: ,

Comments

# re: FSharp – mērvienību atbalsts

Valdi, ļoti gaidu no tevis kādu rakstu sēriju par pamatiem. Maksimāli saprotami, lai cilvēkiem, kas nepazīstami ar funkcionālo programmēšanu to izprastu un izmantotu.

Friday, March 19, 2010 10:02 PM by andrejs.mamontovs

# re: FSharp – mērvienību atbalsts

Artclies like this really grease the shafts of knowledge.

Thursday, October 06, 2011 12:12 AM by Bones

# Interesting, thanks

Thanx with the work, sustain the nice function Excellent operate, I'm gonna begin a tiny Web site Engine training course perform utilizing your internet site I am hoping you appreciate running a blog with all the well-liked BlogEngine.internet.Thethoughts you express are truly amazing. Wish you are going to correct some far more posts.

Wednesday, November 16, 2011 11:27 PM by Mark Sivertsen

# BiFZaKBzlIDvHtLEm

YFG3eK Thanks-a-mundo for the article. Awesome.

Saturday, March 24, 2012 3:39 AM by buy google plus

Leave a Comment

(obligāts) 
(obligāts) 
(brīvizvēles)
(obligāts)