..
Johdanto
Funktionaalinen ohjelmointi (FP) on ohjelmoinnin paradigma vaihtoehto perinteiselle (rakenteellinen tai välttämätöntä ohjelmoinnin ja olio-ohjelmointi) keksi, kuin "lambda calculus" by Alonso Church in 30 vuotta, paljon ennen kuin oli tiedossa, että mitä se oli tietokone.
Tutkimukset kirkon toimi pohjana kehittämiseen ohjelmointikieli Lisp, ja sitten ne olivat lähes kokonaan luovuttu, koska he vaativat ehdottomasti ohjelmointi tietokoneiden tuottama Basic ja Pascal, C, ja tänään modernia C + + ja Java.
Perusidea lambda calculus on, että tietokoneohjelma voi ilmaista, eikä pakollisia joukko ohjeita (tehdä tämän, tee tämä, sitten se tehdään), jossa useita eri toimintoja, joiden parametrit ovat sama numero toiminnot.
Toiminnallinen ohjelma on yleensä koostuu toiminto, joka vie syötteenä toinen toiminto, joka vie toisen funktion syötteenä ja niin edelleen.
Tämä tarkoittaa, että vaikka perinteinen ohjelma, kirjoitettu välttämätöntä paradigman tai esineitä, koostuu sarjasta komennoista Laki muuttujaa, jonka arvo vastaa "tilaan" ohjelman Funktionaalinen ohjelmointi aivan käsitteen muuttujaa ei ole olemassa (Ei ole käsitettä "valtio"), ja niiden toteuttaminen on uskottu useita toimintoja, jotka toimivat vakio-toiminto.
Kiinnostus toimiva kielillä on kadonnut ajan myötä useista syistä, erityisesti vaikeus oppimisen (yleensä mies ajattelee esineiden sijaan toiminnot, ellei hän ole matemaatikko!) Ja vaikeus löytää tehokkaita tulkkeja tai kääntäjiä.
Ruby ja FP
Nykyään tämä kiinnostus on herännyt, mutta koska funktionaalinen ohjelmointi tuo mukanaan seurauksena erittäin arvokas: se ei voi lähtökohtaisesti johtaa Bugs ajon aikana. Toisin sanoen, käännöksen yhteydessä tai ensimmäistä kertaa joko se toimii tai ei toimi. Ei voi käyttäytyä tavalla, joka ei odotettavissa priori (toiminnallisessa ohjelmassa, itse asiassa, ei ole käsitettä poikkeus).
Näin ovat syntyneet ja jotkut ovat kukoistava toiminnallisia kieliä (enemmän tai vähemmän puhdasta, ja enemmän tai vähemmän tukea perinteinen ohjelmointi) kuten: ML / OCaml , Haskell , F # .
Ruby ei ole toimiva kieli, mutta käyttää toiminnallisia ohjelmoinnin tekniikoita, jotka voivat auttaa meitä muotoilemaan algoritmien synteettisempi, voimakkaampi ja tehokkaampi. Sen lisäksi, että yleensä, helpompi lukea.
Jokainen ja kartta
Ensimmäinen ominaisuus kieliä, jotka tukevat jollakin tavalla FP, on saada oman standardin kirjastossa iterators toimiva. Esimerkiksi:
$ Elements = [1,2,3,4,5]
Elementi.map $ {| Elem | laittaa Elem} + 1
Toiminnot "map" ja "jokainen" on Ruby ei ole muuta kuin soveltaa FP!
Itse asiassa on toiminnot, jotka ovat muita tehtäviä argumentteja.
Ruby, sitten, että ne osat korttelin koodia ympäröidään {} tai välillä tehdä / loppuun Nimetön toiminnot ovat rakennettu nimenomaan olla aiheita monia toimintoja.
Nämä toiminnot ovat kutsutaan FP-järjestyksessä toiminnot, eli toimintoihin, joissa niin monia toimintoja syötteenä.
Erityisesti "kartta" toimii klassinen ja matemaattinen funktio voidaan lukea seuraavasti: kullekin elementille sarjan yksi-viisi, suorita toiminto: Tulosta seuraava luonnollinen luku.
Että "kartan" tai "osakkuusyritysten", kullekin elementille kokoelma (Array Ruby sanoisimme) tietty tehtävä määritellään lohkon.
Sama tapahtuisi luontevasti:
$ Elementi.each {...}
Sulkimet: Proc ja lambda
Sulkemiset ovat käsite samanlainen kuin korkean asteen funktio: kyky määritellä merkittävästi funktio muuttujien Laki asuvat yhteydessä eroaa toiminto (esim. globaaleja muuttujia tai muuttujat muita toimintoja).
Ruby, voin kirjoittaa sulkeminen nimetöntä toimintoja voidaan määritellä avainsanoja Proc.new tai lambda.
Tässä esimerkki:
def moninkertaistaa (kerroin)
palata lambda {| n | n * kerroin}
pää
per3 = kertolasku (3)
per3.call puts (3) # => 9
laittaa per3.call (per8.call (2)) # => 48
Ei aivan itsestään selvä tässä esimerkissä funktio "kertomalla".
Mikä on niin outoa tämä toiminto?
Täällä eivät yksinkertaisesti käytä mitään muuttuja!
Väite ei ole muuttuja kerroin on vain paikkamerkki vakio tai toisen toiminnon.
Mutta perinteinen ohjelmointi, olisin kirjoittaa:
def moninkertaistaa (a, b)
palata * b
pää
tuo kertolasku (3.3)
Kuten voidaan nähdä, en kuitenkaan määritellä sulkeminen käyttäen "operaattori" Kehotan per3, jossa määritellään käyttäytymisen kaikkien kertolaskutoimitusten "x3".
Sitten Kutsun tätä operaattorin numeron 3.
Voin myös kutsua sitä rekursiivisesti!
Tai soita sen sijaan, että jatkuvasti, toisen toiminnon.
Perinteisessä ohjelmointi, olen kuitenkin pakko määritellä etukäteen määrän muuttujia mukana liiketoimessa - mikä rajoittaa lisääntymistä kaksi numeroa - ja mikä tärkeintä, olen lisätä käsite valtion myöntäen muisti kaksi muuttujaa, jotka sisältävät arvot kerrotaan.
| |
Ruby ja Ruby on Rails (kurssi)
Luo ohjelmistojen ja web-sovellusten kanssa Ruby ja RoR. Alkaen 39 €. |