Nosaukums nav diezko aizraujošs, bet gribēju pastāstīt par iespējams vienu no nozīmīgākajām F# valodas konstrukcijām – operatoru “|>”.
Tā definīcija ir pavisam vienkārša:
let (|>) x f = f x
No tipa definīcijas ir saprotams, ka tā ir inversā operācija, kas padotajam argumentam pielieto padoto funkciju.
Tipa definīcija ir:
val (|>) : 'a –> ('a –> 'b) –> 'b
kas nozīmē, ka funckija ar diviem argumentiem, kuras rezultāts (... –> 'b) ir otrā argumenta funckijas (... ('a –> 'b) ...) gala produkts.
No varētu dot šāda veida “fast forward” pieraksta veids? Clarity jeb koda lasāmību un uztveramību.
Īss ilustratīvs piemērs:
let add a b = a + b
let nums = [1; 2; 3; 4; 5]
let odds_plus_ten =
List.map (add 10)
(List.filter (fun n -> n % 2 <> 0) nums)
Šajā piemērā definējam vispirms funkciju, kas saskaita 2 vērtības (jauki, ka F# ir tipu noteikšanas iespēja), definē sarakstu ar cipariem un katram nepāra ciparam iepriekš definētajā sarakstā pieskaita vērtību 10.
Kods izskatās pietiekoši imperatīvs, lai vairums .Net lietotāju to saprastu un pieraksts likots pazītams un ierasts.
Izmantojot lielisko “cauruļošanas” iespēju F# valodā, augstāk minētās funckijas pieraksts būtu šāds:
let odds_plus_ten =
nums
|> List.filter (fun n-> n%2 <> 0)
|> List.map (add 10)
Kā rezsultātā List.filter funckija tiks izsaukta gan ar filtrēšanas funkciju, gan arī ar definēto ciparu kopu un funkcijas rezultāts tiks nodots tālāk List.map funckijas izpildei, kas izsauks ``List.map'' funkciju katram saraksta elementam.
Pieraksts varbūt ir nedaudz nepierasts un savādāks, bet, manuprāt, daudz reiz saprotamāks un lasāmāks, cik nu funkcionālais stils var būt lasāms :)
Tātad, “|>” operātors mums dod sekojošas priekšrocības:
- Clarity. Ja tiek pielietots ar List.map un tamlīdzīgas klases funkcijām, datu tranformāciju un iterācijas var pierakstīt ķēdes pierakstā, kas palielina koda lasīmību.
- Type inference. Pielietojot “|>” operatoru tiek panākta objektu tipa informācijas plūsma no kreisās puses, kur tiek definēts ieejas objekts, uz labo pusi – funckijām, kas manipulē ar šiem objektiem. F# pats izmanto šo informāciju, lai risinātu dažāda rakstura valodas konstrukcijas jautājumus (īpašību pieeja un metožu pārlādi).
Cermas, ka noderēs!