- Основне идеје
- карактеристике
- Чисте функције
- Првокласне карактеристике
- Референтна транспарентност
- Рекурзија
- Непроменљивост
- Примери
- Императивни и декларативни приступи
- Чисте функције
- Функционише као првокласни објекти
- Предност
- Краће и лакше разумети
- Нема контролног протока
- Недостаци
- Апликације
- Функционална методологија
- Језици који подржавају функционално програмирање
- Д
- Ерланг
- Хаскелл
- МЛ
- Циљ Цамл
- Шема
- Референце
Тхе функционалне програмирање одговара програмирање паттерн се заснива на концепту наводећи понашање програма као функционални математички модел него експлицитним секвенце инструкција за процесор, који је главни концепт императивно програмирање.
Функционални језик наглашава изјаве и појмове, а не извршавање изјава. У овом програмирању резултат ће зависити само од параметара који су прослеђени функцији, за разлику од других типова који слушају локално или глобално стање.
Дијаграм како функција мапирања функционише у Хаскелл функционалном програмском језику. Извор: Плуке - Властито дело, ЦЦ0 цоммонс.викимедиа.орг.
Његово име долази од математичких функција, које су додељивање скупа улаза скупу излаза. Математичка функција заправо не ради никакав посао, већ описује модел процеса, објашњавајући помоћу формуле шта скуп улаза производи у функцији.
Основне идеје
Основа на којој се заснива функционално програмирање био је ламбда рачун, који је развијен у трећој деценији КСКС века за дефинисање и примену функција. ЛИСП је први такав програмски језик дизајниран 1960. године.
Иако се већина програмских језика састоји од улаза, излаза и вањских варијабли које се могу подесити или користити из функција, функционално програмирање то избјегава. Идеја је да сваки пут када се функција назове са истим параметрима, она мора враћати исту вредност.
карактеристике
Функционални програмски језици се називају апликације, јер се функције примењују на њихове параметре, као и на декларативне и не-процедуралне, јер дефиниције одређују шта се израчунава а не како се израчунава.
Чисте функције
Функција је чиста када нема уочљивих споредних ефеката, као што су измена спољних променљивих, промене система датотека и тако даље.
Ове се функције сматрају убедљивим јер неће изричито изменити променљиве од којих у неком тренутку могу да зависе други делови кода. Изгледало би непријатно да се та ограничења кодирају, али ове функције се морају сматрати детерминистичким, предвидљивим и компостирајућим.
Првокласне карактеристике
Функције се сматрају вриједностима које се могу додијелити варијаблама, тако да се могу пренијети и вратити са других функција. То јест, функција се може користити као да је параметар или као вриједност која се враћа.
Ово подразумева да се функција може пренети као таква, а не само као резултат функције. На пример, размотрите двоструку (к) функцију, која враћа двоструко већу вредност свог улазног параметра. Дакле, двоструки (2) би вратио 4.
Како се ради о функцији прве класе, код (двоструки (двоструки (2)) би био исти као двоструки (4) код, што вам омогућава да гнездете једну функцију као параметар друге, и тако даље.
Референтна транспарентност
Односи се на чињеницу да у овом програмском обрасцу не постоје изјаве о додјели. Односно, морате дефинирати нове варијабле ако желите похранити додатне вриједности. Стога је стање променљиве у сваком тренутку константно.
Ово елиминира и најмању могућност нежељених ефеката, јер било која варијабла може бити замијењена његовом стварном вриједношћу током било које тачке извршења програма.
Рекурзија
У функционалном програмирању не постоје петље "за" и "вхиле". Уместо тога, итерација се ослања на рекурзију. Рекурзија се проводи помоћу рекурзивних функција, које себе понављају понављајући све док се не постигне основни случај.
Непроменљивост
Варијабле су непроменљиве, то јест, није могуће изменити променљиву након што је иницијализирана. Иако можете да креирате нову променљиву, измена постојећих променљивих није дозвољена.
Примери
Императивни и декларативни приступи
Примјером можете анализирати разлику између ових приступа, изводећи исту операцију у оба аранжмана, а то је филтрирање непарних бројева с листе, а замјена 5 за парне бројеве мање од 5.
То је исти израчун, с истим резултатом. Међутим, као што видите, императивни код је исцрпан и није одмах јасан. С друге стране, декларативни приступ је читљив и изричит, јер се фокусира на оно што желите добити.
Чисте функције
Шта је дефинисано као чиста и нечиста функција може се разјаснити неким основним примерима:
Функционише као првокласни објекти
То значи користити функције на исти начин на који се користе подаци. Због тога се они могу пренијети као параметри другој функцији. У следећем примеру, функција инт може се пренети као параметар функцији мапирања:
>>> листа (мапа (инт,))
Могу се доделити променљивим и вратити. На пример, у следећем коду можете доделити функцију хелло_ворлд, а затим извршити променљиву као функцију.
Предност
- Фокусирајте се на оно што желите да постигнете (декларативно), а не на начин како то постићи (императив).
- Не садрже изјаве о додјели, тако да након што се варијаблама додели вриједност, оне се више неће мијењати. Због тога, функционални програми не садрже никакве нуспојаве.
- Логички ток је јасан, јер је стање мање распршено и није имплицитно модификовано.
- Подржава концепт лењо оцењивања, што значи да се вредност процењује и чува само када је неопходно.
- Пошто чисте функције не мењају ниједно стање и потпуно зависе од уноса, лако их је разумети. Повратна вредност коју дају такве функције једнака је резултату који су произвели.
- Због природе чистих функција којима се избегавају промене променљивих или било каквих спољних података, примена конкурса постаје на снази.
- Функције се третирају као вриједности, а прелазе на остале функције као параметри. Ово побољшава разумевање и читљивост кода.
- Чисте функције једном узимају параметре, производећи непроменљив излаз. Употреба непроменљивих вредности олакшава уклањање погрешака и тестирање.
Краће и лакше разумети
Они су краћи и лакше их је разумети него императиви. Студије су показале да је просечна продуктивност програмера у смислу кодних линија мање или више иста за било који програмски језик, што претвара у већу продуктивност.
Нема контролног протока
Позивање функције не може имати другачији ефекат од израчунавања њеног резултата. Ово искључује главни извор грешака, а редослед извршења чини ирелевантним, јер ниједан споредни ефекат не може променити вредност израза и може се проценити у било ком тренутку.
Програмер је ослобођен терета успостављања тока контроле. Пошто се изрази могу оценити у било којем тренутку, променљиве се могу заменити њиховим вредностима.
Ова аутономија функционалне програме чини математички управљивијима од класичних програма.
Недостаци
- Парадигма функционалног програмирања није једноставна, па је почетнику тешко разумјети.
- Тешко је то одржавати, јер се током кодирања развија много објеката.
- У неким случајевима писање чистих функција узрокује смањење читљивости кода.
- Променљиве вредности у комбинацији са рекурзијом могу довести до драстичног смањења перформанси система.
- Поновна употреба је веома компликована и захтева стално рефацторинг.
- Писање програма у рекурзивном стилу уместо коришћења петљи или петљи може бити врло застрашујући задатак.
- Објекти можда неће правилно представити проблем.
- Иако се исписивање чистих функција испоставља једноставно, комбиновати их са остатком апликације и операцијама уноса / излаза је прилично тешко.
Апликације
Програмирање вештачке интелигенције врши се на функционалним програмским језицима, а технике вештачке интелигенције прелазе на апликације у стварном свету.
Такође се истиче у примени сложених математичких модела. Из тог разлога, једна од главних употреба функционалних језика традиционално је академска. Корисно је за развој извршних спецификација и имплементацију прототипа.
Многи функционални језици се такође одлично сналазе у спровођењу паралелне обраде. То је због његове способности да користи чисте функције, које увек враћају исту вредност без обзира на редослед којим се извршавају.
Функционална методологија
ВхатсАпп користи програмски језик Ерланг, који следи модел функционалног програмирања, омогућавајући више од стотину својих запослених да обрађују податке који припадају око 1,6 милијарди људи.
Други важан носилац функционалног стила програмирања је Хаскелл. Фацебоок га користи у свом антиспам систему. Чак и ЈаваСцрипт, један од најчешће коришћених програмских језика, засмета својствима динамички типканог функционалног језика.
Језици који подржавају функционално програмирање
Д
Дизајниран је након Ц ++, узимајући све његове предности истовремено уклањајући уочене слабости да мора бити компатибилан са Ц.
Ерланг
Високо је скалабилна и истовремена, што га чини идеалним за телекомуникације и друге апликације које примају огромне количине података непредвидљивим редоследом.
Хаскелл
Ово је чисти функционални програмски језик, који користи Ламбда рачуницу.
МЛ
Користи се у математичким, научним, финансијским, аналитичким и другим наменама. Једна од његових предности је стварање софтвера за руковање другим програмима.
Циљ Цамл
То је језик отвореног кода који је заснован на Цамлу. Тежи креирању врло лаганих програма, помажући им да се учитавају и раде брже од оних које стварају други језици.
Шема
Заснован је на ЛИСП синтакси и АЛГОЛ структури. Због своје једноставности, користи се на многим курсевима информатике као увод у дизајн програма како би приказао неке основе рачунарског програмирања.
Референце
- Ко ово гостује (2019). Научите функционално програмирање: Овај стил кодирања уништиће ваш ум. Преузето са: вхоисхостингтхис.цом.
- Андреа Бертоли (2019). Адекватни увод у функционално програмирање. Преузето из: дев.то.
- Хакерска земља (2020). Функционално програмирање. Преузето са: хацкереартх.цом.
- Цлојуре (2020). Функционално програмирање. Преузето са: цлојуре.орг.
- Акхил Бхадвал (2020). Функционално програмирање: концепти, предности, недостаци и апликације. Хацк. Преузето из: хацкр.ио.
- Гуру99 (2020). Шта је функционално програмирање? Водич са примером. Преузето са: гуру99.цом.