..
Ievads
Funkcionālā programmēšana (FP) ir programmēšanas paradigma alternatīva tradicionālajiem (vai strukturālo obligāti plānošanas un objektu orientētas programmēšanas) izgudroja, kā "lambda calculus" ar Alonso Baznīcas 30 gados, arī pirms tam bija zināms, ka tieši tas, kas datoru.
Pētījumi par Baznīcas kalpoja par pamatu attīstībai Lisp programmēšanas valoda, un tad tie ir gandrīz pilnīgi pamesti, jo tā apstiprināja obligāti plānošanas dators, kas radīts Basic un Pascal, C, un šodien modernās C + + un Java.
Pamatideja lambda calculus ir tas, ka datorprogramma var izteikt, nevis obligāto norādījumu kopums (darīt, tad darīt, tad darīt), ar virkni funkciju, kuru parametri ir daudz funkcijas.
Funkcionālās programmas parasti sastāv no funkcijas, kas ņem, ko ievada citas funkcijas, kas notiek cita funkcija kā ievade, un tā tālāk.
Tas nozīmē, ka, lai gan tradicionālo programmu, kas rakstīts obligāta paradigmu vai objektiem, sastāv no vairākiem komandas, kas darbojas uz maināmo lielumu, kuru vērtība ir "valsts" programmu, funkcionālā programmēšana mainīgā jēdziens nepastāv (nav "valsts" jēdziens) un izpilde ir uzticēta vairākas funkcijas, kas darbojas uz pastāvīgu funkciju.
Funkcionālās valodās interese ir zudusi laika gaitā vairāku iemeslu dēļ, jo īpaši mācīšanās (parasti vīrietis domā par objektu, nevis funkcijas, ja vien tā nav matemātiķis!) Grūtības un atrast grūtības efektīvi kompilatori vai tulkiem.
Ruby un FP
Šodien šī interese bija pamodies, tomēr, jo funkcionālā programmēšana līdz ar to rezultātā ļoti vērtīga: tā nevar pēc definīcijas dēļ izpildes laika kļūdas. Citiem vārdiem sakot, kompilēšanas laikā vai pirmo reizi, vai nu tas darbojas vai nedarbojas. Nevar uzvesties veidos nav paredzams jau iepriekš (funkcionālā programma, patiesībā, nav jēdziens izņēmums).
Tādējādi ir dzimuši un daži ir plaukstoša funkcionāls valodām (vairāk vai mazāk tīrs, un ar vairāk vai mazāk atbalsta tradicionālo programmu), piemēram: ML / OCaml , Haskell , F # .
Ruby nav funkcionāls valoda, bet izmanto dažas funkcionālas programmēšanas paņēmienus, kas var palīdzēt mums padarīt algoritmus vairāk sintētiskās, spēcīgāks un efektīvāks. Bez tam, ka parasti vieglāk lasīt.
Katrs un karte
Pirmā īpašība valodām, kas atbalsta kaut kādā veidā FP ir panākt, lai jūsu standarta bibliotēkas funkcionālās iterators. Piemēram:
$ Elementi = [1,2,3,4,5]
$ Elementi.map {| elem | liek elem + 1}
Funkcija "karte" un "katru" Ruby ir nekas vairāk kā piemērot FP!
Patiesībā ir funkcijas, kas ir citas funkcijas kā argumenti.
Ruby, tad, ka tie no kodu blokiem liktas {} vai starp do / end anonīmas funkcijas daļas ir īpaši būvēti, lai tēmām daudzas funkcijas.
Šīs funkcijas tiek pieprasītas FP liela, lai funkcijas, ti funkcijas, kas ņem tik daudz funkcijas, kā priekšnodokli.
Jo īpaši "karte" darbojas kā klasiskas un matemātiska funkcija var lasīt šādi: katram elementam sērijas 1-5, palaist funkcija: Drukā nākamo naturāls skaitlis.
Ka "karte" vai "partneri", katram elementam kolekcija (Ruby masīvā teiktu), noteiktu funkciju definēts blokā.
Tas pats notiktu dabiski ar:
$ Elementi.each {...}
Slēgšana: Proc un lambda
Aizbāžņiem koncepciju, kas līdzīga tai, augsti rīkojuma funkcija: spēja būtiski definēt funkciju rīkoties mainīgos, kas dzīvo kontekstā, kas atšķiras no citu funkciju (piemēram, globālo mainīgo vai funkcijas citiem mainīgajiem).
Ruby, es varu uzrakstīt slēgšanas izmantojot anonīmu funkciju, kuru var definēt ar atslēgvārdiem Proc.new vai lambda.
Lūk, piemērs:
galīgā reizināšanas (reizinātājs)
atgriezties lambda {| n | n * koeficients}
beigas
per3 = reizināšanas (3)
per3.call liek (3) # => 9
liek per3.call (per8.call (2)) # => 48
Šajā piemērā, ne tikai funkciju aicinu pašsaprotama "pavairošana".
Kas ir tik dīvaini, šo funkciju?
Šeit es vienkārši nav izmantot jebkuru mainīgo!
Arguments nav mainīgais reizinātājs ir vienkārši vietturis konstante vai funkcija.
Bet, tradicionālā programmēšana, es gribētu rakstīt:
def vairoties (a, b)
atgriezties * b
beigas
liek reizināšanas (3.3)
Kā redzams, taču, izmantojot slēgšanas es saucu par "uzņēmējs" Es aicinu per3, kas nosaka uzvedību visu reizināšanu "x3".
Tad Es aicinu šo operatoru skaits 3.
Es pat varu saukt rekursīvi!
Vai to sauc, nevis pastāvīgu, uz citu funkciju.
Tradicionālajā programmēšana, es tomēr esmu spiests noteikt priori skaitu mainīgo darījumā iesaistīto - tādējādi ierobežojot vairošanos divi numuri - un, pats galvenais, man ir jāievieto jēdzienu valsts, piešķirot atmiņu diviem mainīgajiem, satur vērtības jāreizina.
| |
Protams, Ruby un Ruby On Rails
Izveide programmatūras un Web lietojumprogrammas ar Ruby un ROR. Atlaide -10% līdz 2012/06/01. |