..
Úvod
Funkcionální programování (FP) je programovací vzor alternativou k tradičnímu (strukturální nebo nutné programování a objektově orientované programování) vynalezl, jak "lambda" od Alonso církev za posledních 30 let, dlouho předtím, než bylo známo, že přesně to, co je to počítač.
Studie kostel sloužil jako základ pro vývoj programovacích jazyků Lisp, a pak byl téměř zcela opuštěné, protože tvrdil, že imperativ programování počítačů, které generovalo Basic a Pascal, C, a dnes moderní C + + a Java.
Základní myšlenkou lambda je, že počítačový program může být vyjádřena místo povinného sadu instrukcí (to pak udělat, pak to, že), s řadou funkcí, jejichž parametry jsou stejné číslo funkce.
Funkční program se zpravidla skládá z funkce, která bere jako vstup Další funkce, která má další funkce jako vstup, a tak dále.
To znamená, že zatímco tradiční program, napsaný v imperativ paradigmatu nebo objekty, se skládá ze série příkazů, které působí na proměnnou, jejíž hodnota představuje "stát" programu, funkcionální programování v samotném pojetí proměnná neexistuje (není pojem "stát"), a výkon je svěřen k množství funkcí, které pracují na konstantní funkce.
Zájem o funkcionálních jazyků byla ztracena v průběhu času z několika důvodů, především obtížnost učení (obvykle člověk si myslí, že objekty a ne funkce, pokud je matematika!) A obtíže při hledání tlumočníků účinná a kompilátory.
Ruby a FP
Dnes je tento zájem byl probuzen, ale proto, že funkcionální programování s sebou přináší důsledek velmi cenné: nemůže samozřejmě vést k chybám při běhu. Jinými slovy, v době kompilace nebo poprvé buď to funguje nebo nefunguje. Nelze chovají nepředpokládá a priori (ve funkční program, ve skutečnosti neexistuje žádný koncept výjimky).
Tak se narodili a někteří se daří funkční jazyky (více či méně čisté, a více či méně podporuje tradiční programování) jako: ML / OCaml , Haskell , F # .
Ruby není funkční jazyk, ale používá funkcionální programování techniky, které nám mohou pomoci formulovat algoritmy více syntetické, účinnější a efektivnější. Kromě toho obvykle, čitelnější.
Každý a map
První charakteristikou jazyků, které podporují nějakým způsobem FP, je mít ve své standardní knihovně iterátory funkční. Například:
$ Prvky = [1,2,3,4,5]
Elementi.map $ {| elem | dá elem} + 1
Funkce "map" a "každý" v Ruby není nic jiného než použít FP!
Ve skutečnosti tam jsou funkce, které mají jiné funkce jako argumenty.
V Ruby, tedy, že ty části bloky kódu, uzavřený v {} nebo mezi to / konec anonymní funkce jsou vyrobeny speciálně k tématům z mnoha funkcí.
Tyto funkce jsou volány funkce FP vyššího řádu, tedy funkce, které se co nejvíce funkcí, jako vstup.
Zejména akty "map", jako klasické a matematické funkce může být takto: pro každý prvek z řady jeden-pět, spustit funkce: Tisk na další přirozené číslo.
, Že "map" a "kolegové", pro každý prvek kolekce (pole v Ruby bychom řekli) určité funkce definované v bloku.
Totéž by se stalo, přirozeně s:
$ Elementi.each {...}
Uzávěry: proc a lambda
Uzávěry je pojetí podobné, že vysoce-objednávat funkce: možnost definovat podstatné funkce proměnných, které působí na život v kontextu odlišné od funkce (např. globální proměnné nebo proměnných jiných funkcí).
V Ruby, mohu psát uzavření pomocí anonymní funkce, které mohou být definovány pomocí klíčových slov Proc.new nebo lambda.
Zde je příklad:
def násobení (násobič)
návrat lambda {| n | n * násobič}
konec
per3 = násobení (3)
per3.call dá (3) # => 9
klade per3.call (per8.call (2)) # => 48
Ne tak úplně samozřejmé, v tomto případě jsem se definovat funkci "násobit".
Co je tak zvláštní tuto funkci?
Tady prostě nepoužívají žádné proměnné!
Argument není proměnná násobič je prostě zástupný symbol pro konstantní, nebo jinou funkci.
Ale v tradiční programování, tak bych napsat:
def násobení (a, b)
vrátit a * b
konec
dá násobení (3.3)
Jak je vidět, jsem však definovat uzavření pomocí "provozovatel" I call per3, která definuje chování všech násobení "x3".
Pak jsem volat tento operátor číslo 3.
Také mohu nazývat rekurzivně!
Nebo říkají, místo konstanty, na jinou funkci.
V tradiční programování, ale jsem nucen předem definovat počet proměnných, které jsou předmětem transakce - a tím omezuje rozmnožování dvou čísel - a co je nejdůležitější, musím vložit koncepce státu, přidělování paměti pro dvě proměnné, které obsahují hodnoty, které se násobí.
| |
Ruby a Ruby on Rails (kurz)
Vytvořit software a webových aplikací s Ruby a RoR. Od 39 €. |