..


Спонсоред Линкс

Функционално програмирање у Руби

Чланак који је написао Алессио Салтарини
Страна 1 од 2

Увод

Функционална програмирање (ФП) је парадигми програмирања алтернатива традиционалном (или структурне императив програмирање и објектно-оријентисано програмирање) изумео, као "ламбда рачуну" од стране Алонсо црква у последњих 30 година, и пре него што је познато да управо оно што рачунар.

Студије Цркве служио као основа за развој Лисп програмског језика, па су скоро у потпуности напуштена, јер је потврдио императив програмирање рачунар који генерише Основни и као Паскал, Ц, и данас модеран Ц + + и Јава.

Основна идеја ламбда рачуну да компјутерски програм може се изразити, уместо обавезне сет инструкција (то урадили, онда бисте то урадили, онда то), са низом функција чији су параметри су толико функција.

Функционални програм је обично састоји од функције која узима као улаз неку другу функцију која узима неку другу функцију, као улаз, и тако даље.

Ово значи да док Традиционални програм, написан у императивну парадигму или објеката, се састоји од низа команди које делују на променљиву чија вредност представља "државни" програма, у функционалном програмирању концепт променљиве не постоји (не постоји појам "држава") и извршавање је поверено број функција које раде на сталном функцијом.

Интересовање за функционалним језицима је изгубљен током времена из неколико разлога, пре свега тешкоће у учењу (обично човек мисли објеката него функција, осим ако је математичар!) И тешкоћа у проналажењу ефикасан преводиоца или тумача.

Рубин и ФП

Данас, ово интересовање је пробудила, међутим, јер функционални програмски доноси са собом последица веома вредан: она не може по дефиницији резултат рун-тиме грешака. Другим речима, у компајлирати време или по први пут или ради или не ради. Не могу да се понашају на начине не предвидив унапред (у функционалном програму, у ствари, не постоји концепт изузетак).

Тако су рођени, а неки су напредан функционалне језике (више или мање чисто, и са мање или више подршку традиционалним програмирање), као што су: МЛ / ОЦамл , Хаскелл , Ц # .

Руби није функционална језик, али користи неки функционални програмски технике које нам може помоћи да се алгоритме више синтетичких, моћнији и ефикаснији. Поред тога, генерално, лакши за читање.

Сваки и мапа

Први карактеристика језика који подржавају на неки начин ФП је да у стандардне библиотеке функционалних итераторс. На пример:






 $ Елементи = [1,2,3,4,5]







 $ Елементи.мап {| ЕЛЕМ | ставља ЕЛЕМ + 1}



Функција "мапа" ​​и "свака" у Руби нису ништа друго до примењена ФП! У ствари, постоје функције које имају и друге функције као аргументе. У Руби, онда, да оне делове блокова кода затворени у {} или између не / крај анонимне функције су посебно изграђена да буду предмет многих функција.

Ове функције се називају у жижној равни реда функције, односно функције које узимају што више функционише као улаз.

Нарочито "мапи" се понаша као класични и математичких функција се може читати на следећи начин: за сваки елемент низа од једне до пет, покрените функцију: Штампа следећи природан број.

Да је "мапа" ​​или "сарадника", за сваки елемент колекције (низ у Руби би рекао) одређене функције дефинисане у блоку.

Иста ствар би, наравно, догодити са:

 



 $ Елементи.еацх {...}

 
Затварачи: Проц и Ламбда

Затварачи су концепт сличан оном високог реда функција: способност да значајно дефинише функцију да делују на променљиве које живе у контексту разликује од функције (као што су глобалне променљиве или функције других променљивих.)

У Руби, ја могу написати затварања коришћењем анонимне функције које се могу дефинисати са кључним речима Проц.нев или Ламбда.

Ево једног примера:






 коначно множење (мултипликатор)



    



 повратак Ламбда {| Н | Н * мултипликатор}







 крај









 пер3 = множење (3)









 пер3.цалл ставља (3) # => 9







 ставља пер3.цалл (пер8.цалл (2)) # => 48



У овом примеру, а не само функцију зовем очигледна "множење". Шта је толико чудно ова функција? Овде једноставно не користи било коју променљиву!

Аргумент није променљива множилац је једноставно чувар места за стално или функцију.

Али, у традиционалном програмирања, ја бих писати:






 деф умножавају (а, б)



    



 повратак * Б







 крај









 ставља множење (3.3)



Као што се види, међутим, користећи затварање зовем "оператер" ја називам пер3, којим се дефинише понашање свих множења "Кс3". Онда Ја ово зовем оператера број 3. Ја сам чак то може тако назвати рекурзивно! Или га зову, уместо стално на неку другу функцију.

У традиционалном програмирање, међутим, ја сам приморан да дефинише априори број променљивих укључених у трансакцију - на тај начин ограничава умножавање два броја - и, што је најважније, морам да убаците концепт државе, доделе меморије за две променљиве које садрже вредности које ће бити вишеструко.

У истој категорији ...
Е-учење
Наравно Руби и Руби Он Раилс Наравно Руби и Руби Он Раилс
Креирање софтвера и Веб апликација са рубином и РОР. Полазећи од 39 €.
Спонсоред Линкс