Pipelining

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!

Published Sunday, February 22, 2009 11:37 PM by valdis.iljuconoks
Filed under:

Comments

# re: Pipelining

BION I'm imprsesed! Cool post!

Thursday, June 02, 2011 8:45 AM by Ducky

# re: Pipelining

Hey, that post leaves me feeling fosolih. Kudos to you!

Friday, June 03, 2011 5:27 PM by Carly

# I discovered

I would like to thank you for the efforts you have put in writing this site. I'm hoping the same high-grade web site post from you in the upcoming also. In fact your creative writing abilities has inspired me to get my own site now. Really the blogging is spreading its wings quickly. Your write up is a great example of it.  <a href="topautoinsurancerates.net/">car insurance rates</a>

Sunday, October 23, 2011 4:35 AM by car insurance rates

# nAoKCXLiAM

qVbnHT Really enjoyed this post.Really thank you! Will read on...

Saturday, March 24, 2012 12:14 PM by google+ hangouts

Leave a Comment

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