Funkcional programmalastırıw

Kompyuter iliminde **funkcional programmalastırıw** — bul programmalar funkciyalardı qollanıw hám biriktiriw arqalı dúziletuǵın programmalastırıw paradigması. Bul deklarativ programmalastırıw paradigması bolıp, onda funkciya anıqlamaları programmanıń orınlanıw jaǵdayın jańalaytuǵın imperativ operatorlar izbe-izliginiń ornına, mánislerdi basqa mánislerge salıstıratuǵın ańlatpalar teregi bolıp tabıladı.

Funkcional programmalastırıwda funkciyalar birinshi dárejeli obyektler retinde qaraladı, yaǵnıy olar basqa hár qanday maǵlıwmat túri sıyaqlı atlarǵa (sonıń ishinde lokal identifikatorlarǵa da) baylanıstırılıwı, argument retinde beriliwi hám basqa funkciyalardan qaytarılıwı múmkin. Bul programmalardı deklarativ hám kompoziciyalıq (biriktiriletuǵın) stilde jazıwǵa múmkinshilik beredi, bunda kishi funkciyalar modulli túrde biriktiriledi.

Funkcional programmalastırıw geyde taza funkcional programmalastırıw menen sinonim retinde qaraladı, bul funkcional programmalastırıwdıń bir bólimi bolıp, barlıq funkciyalardı deterministlik matematikalıq funkciyalar yamasa taza funkciyalar retinde qarastıradı. Taza funkciya belgili bir argumentler menen shaqırılǵanda, ol bárqulla birdey nátiyje qaytaradı hám oǵan hesh qanday ózgermeli jaǵday yamasa basqa qosımsha tásirler tásir ete almaydı. Bul imperativ programmalastırıwda keń tarqalǵan, qosımsha tásirleri bolıwı múmkin bolǵan (programma jaǵdayın ózgertiw yamasa paydalanıwshıdan maǵlıwmat alıw sıyaqlı) taza emes proceduralarǵa qarama-qarsı keledi. Taza funkcional programmalastırıwdıń tárepdarları qosımsha tásirlerdi sheklew arqalı programmalarda qáteler azıraq bolıwı, olardı sazlaw hám testlew ańsatıraq bolıwı hám rásmiy verifikaciyalawǵa kóbirek sáykes keliwi múmkin ekenligin aytadı.

Funkcional programmalastırıwdıń tamırları akademiyadan baslanıp, tek ǵana funkciyalarǵa tiykarlanǵan formal esaplaw sisteması bolǵan lyambda esaplawınan rawajlanǵan. Funkcional programmalastırıw tariyxıy jaqtan imperativ programmalastırıwǵa qaraǵanda azıraq ataqlı bolǵan, biraq házirgi kúnde kóp funkcional tiller sanaatta hám bilimlendiriwde qollanılmaqta, sonıń ishinde Common Lisp, Scheme, Clojure, Wolfram Language, Racket, Erlang, Elixir, OCaml, Haskell, hám F#. Lean — bul matematikalıq teoremalardı dálillew ushın keńnen qollanılatuǵın funkcional programmalastırıw tili. Funkcional programmalastırıw sonday-aq belgili bir tarawlarda tabıslı bolǵan ayırım tillerdiń de tiykarı bolıp tabıladı, mısalı, Vebte JavaScript, statistikada R, finanslıq analizde J, K hám Q hám XML ushın XQuery/XSLT. SQL hám Lex/Yacc sıyaqlı arnawlı tarawlarǵa arnalǵan deklarativ tiller ózgermeli mánislerge ruqsat bermew sıyaqlı funkcional programmalastırıwdıń ayırım elementlerin qollanadı. Bunnan tısqarı, basqa da kóp programmalastırıw tilleri funkcional stilde programmalastırıwdı qollap-quwatlaydı yamasa funkcional programmalastırıwdıń ózgesheliklerin óz ishine alǵan, mısalı, C++ (C++11 versiyasınan baslap), C#, Kotlin, Perl, PHP, Python, Go, Rust, Raku, hám Java (Java 8 versiyasınan baslap)

## Tariyxı
1930-jılları Alonzo Chyorch tárepinen islep shıǵılǵan lyambda esaplawı — bul funkciyalardı qollanıwǵa tiykarlanǵan formal esaplaw sisteması. 1937-jılı Alan Tyuring lyambda esaplawı menen Tyuring mashinalarınıń ekvivalent esaplaw modelleri ekenligin dálilledi, bul lyambda esaplawınıń Tyuring boyınsha tolıq ekenligin kórsetti. Lyambda esaplawı barlıq funkcional programmalastırıw tilleriniń tiykarın quraydı. Ekvivalent teoriyalıq formulirovka, kombinatorlıq logika, 1920-jılları hám 1930-jılları Mozes Shyonfinkel hám Xaskell Karri tárepinen islep shıǵılǵan.

Keyinirek Chyorch kúshsizirek sistema — ápiwayı tiplestirilgen lyambda esaplawın islep shıqtı, ol barlıq termlerge maǵlıwmat tipin beriw arqalı lyambda esaplawın keńeytti. Bul statikalıq tiplestirilgen funkcional programmalastırıwdıń tiykarın quraydı.

Birinshi joqarı dárejeli funkcional programmalastırıw tili, Lisp, 1950-jıllardıń aqırında Massachusets Texnologiya Institutında (MIT) islep júrgen Djon Makkarti tárepinen IBM 700/7000 seriyasındaǵı ilimiy kompyuterler ushın islep shıǵılǵan. Lisp funkciyaları Chyorchtiń lyambda belgilewi arqalı anıqlanǵan hám rekursiv funkciyalarǵa ruqsat beriw ushın belgi konstrukciyası menen keńeytilgen. Lisp birinshi ret funkcional programmalastırıwdıń kóp paradigmalıq ózgesheliklerin kirgizdi, biraq dáslepki Lisp-ler kóp paradigmalı tiller bolıp, jańa paradigmalar rawajlanǵan sayın kóplegen programmalastırıw stillerin qollap-quwatlawdı óz ishine alǵan. Keyingi dialektler, mısalı Scheme hám Clojure, hám de Dylan hám Julia sıyaqlı tarmaqları Lisp-ti taza funkcional yadro átirapında ápiwayılastırıwǵa hám racionalizaciyalawǵa umtıldı, al Common Lisp ózi almastırǵan kóp sanlı eski dialektlerdiń paradigmalıq ózgesheliklerin saqlaw hám jańalaw ushın proektlestirildi.

Informaciyanı Qayta Islew Tili (IPL), 1956, geyde birinshi kompyuterge tiykarlanǵan funkcional programmalastırıw tili retinde ataladı. Bul simvollar dizimin manipulyaciyalawǵa arnalǵan assembler stilindegi til. Onda funkciyanı argument retinde qabıl etetuǵın funkciyaǵa teń bolǵan generator túsinigi bar hám ol tómengi dárejeli programmalastırıw tili bolǵanlıqtan, kod maǵlıwmat bola aladı, sol sebepli IPL-di joqarı tártipli funkciyalarǵa iye dep esaplawǵa boladı. Biraq, ol ózgeriwshi dizim strukturasına hám uqsas imperativ ózgesheliklerge qattı súyenedi.

Kennet E. Ayverson 1960-jıllardıń basında APL-di islep shıqtı hám onı óziniń 1962-jılǵı «A Programming Language» () kitabında táriyipledi. APL Djon Bekustıń FP tiline tiykarǵı tásir etti. 1990-jıllardıń basında Ayverson hám Rodjer Xyu J tilin jarattı. 1990-jıllardıń ortasında, aldın Ayverson menen islesken Artur Uitni K tilin jarattı, ol óziniń miyrasxorı Q menen birge finans tarawlarında kommerciyalıq maqsetlerde qollanıladı.

1960-jıllardıń ortasında Piter Lendin funkcional programmalastırıw tili ushın birinshi abstrakt mashina SECD mashinasın oylap taptı, ALGOL 60 penen lyambda esaplawı arasındaǵı sáykeslikti táriyipledi, hám ISWIM programmalastırıw tilin usındı.

Djon Bekus 1977-jılǵı Tyuring sıylıǵı lekciyasında FP-di usındı: «Programmalastırıwdı fon Neyman stilinen azat etiwge bola ma? Funkcional stil hám onıń programmalar algebrası». Ol funkcional programmalardı «programmalar algebrasına» múmkinshilik beretuǵın «biriktiriw formaları» arqalı ierarxiyalıq túrde qurıladı dep anıqlaydı; zamanagóy tilde bul funkcional programmalardıń kompoziciyalıq principine ámel etetuǵının ańlatadı. Bekustıń maqalası funkcional programmalastırıw boyınsha izertlewlerdi keń tarqattı, biraq ol házirgi waqıtta funkcional programmalastırıw menen baylanıslı bolǵan lyambda-esaplaw stilinen góre funkciya dárejesindegi programmalastırıwǵa kóbirek itibar qarattı.

1973-jılǵı ML tili Edinburg universitetinde Robin Milner tárepinen jaratıldı, al Devid Tyorner Sent-Endryus universitetinde SASL tilin islep shıqtı. Sonday-aq 1970-jılları Edinburgta Byorstall hám Darlington NPL funkcional tilin islep shıqtı. NPL Klini Rekursiya Teńlemelerine tiykarlanǵan bolıp, birinshi ret olardıń programma transformaciyası boyınsha jumıslarında usınılǵan edi. Keyin Byorstall, MakKuin hám Sannella ML-den polimorf tip tekseriwin qosıp, Hope tilin jarattı. ML aqıbetinde bir neshe dialektke bólindi, olardıń eń keń tarqalǵanları házirgi waqıtta OCaml hám Standard ML bolıp tabıladı.

1970-jılları Gay L. Stil hám Djerald Djey Sassman Lambda Papers hám 1985-jılǵı «Structure and Interpretation of Computer Programs» sabaqlıǵında táriyiplengendey, Scheme tilin islep shıqtı. Scheme leksikalıq kóriw aymaǵın paydalanǵan hám funkcional programmalastırıwǵa ilham beretuǵın ózgeshelikler — quyrıq shaqırıwın optimallastırıwdı talap etken lisp-tiń birinshi dialekti boldı.

1980-jılları Per Martin-Lyof intuicionistlik tip teoriyasın (konstruktivlik tip teoriyası dep te ataladı) islep shıqtı, ol funkcional programmalardı ǵárezli tipler retinde kórsetilgen konstruktiv dáliller menen baylanıstırdı. Bul interaktiv teorema dálillewge jańa kózqaraslarǵa alıp keldi hám keyingi funkcional programmalastırıw tilleriniń rawajlanıwına tásir etti.

Devid Tyorner tárepinen islep shıǵılǵan «jalqaw» funkcional til Miranda dáslep 1985-jılı payda boldı hám Haskell-ge kúshli tásir etti. Miranda menshikli bolǵanlıqtan, Haskell 1987-jılı funkcional programmalastırıw izertlewleri ushın ashıq standart dúziw boyınsha kelisim menen baslandı; implementaciya relizleri 1990-jıldan berli dawam etpekte.

Sońǵı waqıtlarda ol CGAL freymvorkına tiykarlanǵan OpenSCAD tilinde parametrlik CAD sıyaqlı tarawlarda qollanıla basladı, biraq onıń mánislerdi qayta menshiklewge sheklewi (barlıq mánisler konstantalar retinde qaraladı) funkcional programmalastırıw koncepciyası menen tanıs bolmaǵan paydalanıwshılar arasında aljasıwǵa alıp keldi.

Funkcional programmalastırıw kommerciyalıq ortalıqlarda qollanılıwın dawam etpekte.

## Túsinikler
Funkcional programmalastırıwǵa tán hám ulıwma alǵanda imperativ programmalastırıwǵa (sonıń ishinde obyektke baǵdarlanǵan programmalastırıwǵa da) jat bolǵan bir qatar túsinikler hám paradigmalar bar. Biraq, programmalastırıw tilleri kóbinese bir neshe programmalastırıw paradigmasın qollaydı, sonlıqtan «tiykarınan imperativ» tillerdi paydalanatuǵın baǵdarlamashılar usı túsiniklerdiń ayırımların paydalanǵan bolıwı múmkin.

### Birinshi dárejeli hám joqarı tártipli funkciyalar
Joqarı tártipli funkciyalar — bul basqa funkciyalardı argument retinde qabıl ete alatuǵın yamasa olardı nátiyje retinde qaytara alatuǵın funkciyalar. Matematikalıq analizde joqarı tártipli funkciyanıń mısalı — bul f funkciyasınıń tuwındısın qaytaratuǵın d/dx differencial operatorı.

Joqarı tártipli funkciyalar birinshi dárejeli funkciyalar menen tıǵız baylanıslı, sebebi joqarı tártipli funkciyalar da, birinshi dárejeli funkciyalar da funkciyalardı basqa funkciyalardıń argumentleri hám nátiyjeleri retinde qollanıwǵa ruqsat beredi. Ekewiniń arasındaǵı ayırmashılıq júdá názik: «joqarı tártipli» basqa funkciyalar menen isleytuǵın funkciyalardıń matematikalıq túsinigin táriyipledi, al «birinshi dárejeli» — bul programmalastırıw tili obyektleriniń qollanılıwında hesh qanday sheklewleri joq ekenligin bildiretuǵın kompyuter ilimi termini (solay etip birinshi dárejeli funkciyalar sanlar sıyaqlı basqa birinshi dárejeli obyektler programmanıń qálegen jerinde, sonıń ishinde basqa funkciyalardıń argumentleri retinde hám olardıń qaytarılǵan mánisleri retinde de ushırasa aladı).

Joqarı tártipli funkciyalar bólek qollanıwǵa yamasa kerrińlewge múmkinshilik beredi, bul funkciyanı óz argumentlerine birme-bir qollanatuǵın usıl bolıp, hárbir qollanıw kelesi argumentti qabıl etetuǵın jańa funkciyanı qaytaradı. Bul baǵdarlamashıǵa, mısalı, keyingi san funkciyasın tábiyiy san birge bólek qollanılǵan qosıw operatorı retinde qısqasha ańlatıwǵa múmkinshilik beredi.

### Taza funkciyalar
Taza funkciyalar (yamasa ańlatpalar) hesh qanday qosımsha tásirge iye emes (yad yamasa kirgiziw/shıǵarıw). Bul taza funkciyalardıń bir qatar paydalı qásiyetlerge iye ekenligin ańlatadı, olardıń kópshiligin kodtı optimallastırıw ushın qollanıwǵa boladı:

* Eger taza ańlatpanıń nátiyjesi qollanılmasa, onı basqa ańlatpalarǵa tásir etkizbey alıp taslawǵa boladı.
* Eger taza funkciya qosımsha tásir payda etpeytuǵın argumentler menen shaqırılsa, nátiyje sol argumentler dizimine qaraǵanda turaqlı boladı (geyde siltemelik anıqlıq yamasa idempotentlik dep ataladı), yaǵnıy taza funkciyanı birdey argumentler menen qayta shaqırıw birdey nátiyjeni qaytaradı. (Bul yadlaw sıyaqlı keshlew optimallastırıwlarına múmkinshilik bere aladı.)
* Eger eki taza ańlatpa arasında maǵlıwmatlar ǵárezliligi bolmasa, olardıń tártibin ózgertiwge yamasa parallel orınlawǵa boladı hám olar bir-birine kesent ete almaydı (basqasha aytqanda, hár qanday taza ańlatpanı bahalaw aǵımǵa qáwipsiz boladı).
* Eger pútkil til qosımsha tásirlerge ruqsat bermese, onda qálegen bahalaw strategiyasın qollanıwǵa boladı; bul kompilyatorǵa programmadaǵı ańlatpalardıń bahalanıwın qayta tártiplestiriwge yamasa birlestiriwge erkinlik beredi (mısalı, ormansızlandırıwdı qollanıp).

Imperativ programmalastırıw tilleri ushın kóp kompilyatorlar taza funkciyalardı anıqlaydı hám taza funkciyalardıń shaqırıwları ushın ulıwma ishki ańlatpalardı alıp taslawdı orınlaydı, biraq olar bunı aldınnan kompilyaciyalanǵan kitapxanalar ushın bárqulla isley almaydı, sebebi olar ádette bul informaciyanı kórsetpeydi, solay etip, sol sırtqı funkciyalar menen baylanıslı optimallastırıwlardıń aldın aladı. gcc sıyaqlı ayırım kompilyatorlar baǵdarlamashıǵa sırtqı funkciyalardı taza dep anıq belgilewi ushın qosımsha gilt sózler qosadı, bul bunday optimallastırıwlarǵa múmkinshilik beredi. Fortran 95 te sonday-aq funkciyalardı taza dep belgilewge ruqsat beredi. C++11 uqsas semantikaǵa iye `constexpr` gilt sózin qostı.

### Rekursiya
Funkcional tillerde iteraciya (cikl) ádette rekursiya arqalı ámelge asırıladı. Rekursiv funkciyalar ózlerin shaqıradı, bul operaciyanıń tiykarǵı jaǵdayǵa jetkenshe qaytalanıwına múmkinshilik beredi. Ulıwma alǵanda, rekursiya stekti saqlawdı talap etedi, ol rekursiyanıń tereńligine sızıqlı muǵdarda orın iyeleydi. Bul rekursiyanı imperativ cikllerdiń ornına qollanıw ushın júdá qımbat etip qoyıwı múmkin. Biraq, quyrıq rekursiyası dep atalatuǵın rekursiyanıń arnawlı forması kompilyator tárepinen anıqlanıp, imperativ tillerde iteraciyanı ámelge asırıw ushın qollanılatuǵın birdey kodqa optimallastırılıwı múmkin. Quyrıq rekursiyasın optimallastırıw, basqa usıllar qatarında, kompilyaciya waqtında programmanı dawam etiw stiline ózgertiw arqalı ámelge asırılıwı múmkin.

Scheme tiliniń standartı implementaciyalardıń durıs quyrıq rekursiyasın qollap-quwatlawın talap etedi, yaǵnıy olar sheksiz sanlı aktiv quyrıq shaqırıwlarına ruqsat beriwi kerek. Durıs quyrıq rekursiyası tek ǵana optimallastırıw emes; bul paydalanıwshılarǵa cikldi ańlatıw ushın rekursiyanı paydalana alatuǵınlıǵına hám bunıń orın jaǵınan qáwipsiz bolatuǵınına kepillik beretuǵın til ózgesheligi. Sonıń menen birge, atına qaramastan, ol tek quyrıq rekursiyasın emes, al barlıq quyrıq shaqırıwların esapqa aladı. Durıs quyrıq rekursiyası ádette kodtı imperativ cikllerge aylandırıw arqalı ámelge asırılsa da, implementaciyalar onı basqa usıllar menen de ámelge asırıwı múmkin. Mısalı, Chicken qasaqana stekti saqlaydı hám stektiń tolıp ketiwine jol qoyadı. Biraq, bul júz bergende, onıń shıǵındı jıynawshısı orındı qaytarıp aladı, bul quyrıq rekursiyasın ciklge aylandırmasa da, sheksiz sanlı aktiv quyrıq shaqırıwlarına múmkinshilik beredi.

Rekursiyanıń ulıwma úlgilerin joqarı tártipli funkciyalar arqalı abstraktlawǵa boladı, bunda katamorfizmler hám anamorfizmler (yamasa «búgiwler» hám «ashıwlar») eń anıq mısallar bolıp tabıladı. Bunday rekursiya sxemaları imperativ tillerdegi cikller sıyaqlı ornatılǵan basqarıw strukturalarına uqsas rol oynaydı.

Kópshilik ulıwma maqsetli funkcional programmalastırıw tilleri sheklenbegen rekursiyaǵa ruqsat beredi hám Tyuring boyınsha tolıq bolıp tabıladı, bul toqtaw máselesin sheshilmeytuǵın etedi, teńlikli pikir júritiwdiń nadurıslıǵına alıp keliwi múmkin hám ulıwma alǵanda tildiń tip sisteması menen ańlatılǵan logikaǵa sáykes emeslikti kirgiziwdi talap etedi. Rocq sıyaqlı ayırım arnawlı maqsetli tiller tek ǵana jaqsı tiykarlanǵan rekursiyaǵa ruqsat beredi hám kúshli normalizaciyalanadı (juwmaqlanbaytuǵın esaplawlar tek ǵana kodata dep atalatuǵın sheksiz mánisler aǵımları menen ańlatılıwı múmkin). Nátiyjede, bul tiller Tyuring boyınsha tolıq bolmaydı hám olarda belgili bir funkciyalardı ańlatıw múmkin emes, biraq olar sheklenbegen rekursiya menen kirgizilgen mashqalalardan saqlanıp, qızıqlı esaplawlardıń keń bir klasın ańlata aladı. Bir neshe basqa sheklewleri bar jaqsı tiykarlanǵan rekursiya menen sheklengen funkcional programmalastırıw tolıq funkcional programmalastırıw dep ataladı.

### Qatań hám qatań emes bahalaw
Funkcional tillerdi olar qatań (ashkóz) yamasa qatań emes (jalqaw) bahalawdı paydalanıwına qaray kategoriyalarǵa bóliwge boladı, bul túsinikler ańlatpa bahalanıp atırǵanda funkciya argumentleriniń qalay qayta isleniwine silteme beredi. Texnikalıq ayırmashılıq sátsiz yamasa uzaqlasıwshı esaplawları bar ańlatpalardıń denotaciyalıq semantikasında. Qatań bahalaw astında, sátsiz ishki ańlatpası bar hár qanday ańlatpanı bahalaw sátsiz boladı. Mısalı, Pythondaǵı
```python
print(len([2 + 1, 3 * 2, 1 / 0, 5 - 4]))
```
operatorı qatań bahalawda dizimniń úshinshi elementindegi nolge bóliw sebepli sátsiz boladı. Jalqaw bahalawda uzınlıq funkciyası 4 mánisin qaytaradı (yaǵnıy dizimdegi elementler sanı), sebebi onı bahalaw dizimdi quraytuǵın elementlerdi bahalawǵa háreket etpeydi. Qısqasha aytqanda, qatań bahalaw funkciyanı shaqırıwdan aldın bárqulla funkciya argumentlerin tolıq bahalaydı. Jalqaw bahalaw funkciya shaqırıwınıń ózin bahalaw ushın mánisleri talap etilmese, funkciya argumentlerin bahalamaydı.

Funkcional tillerde jalqaw bahalawdıń ádettegi implementaciya strategiyası — bul graf redukciyası. Jalqaw bahalaw Miranda, Clean hám Haskell sıyaqlı bir neshe taza funkcional tillerde standart boyınsha qollanıladı.

Xyuz 1984 jalqaw bahalawdı máselelerdi ajıratıw arqalı programma modulliligin jaqsılaw mexanizmi retinde, maǵlıwmat aǵımlarınıń óndiriwshileri menen tutınıwshılarınıń ǵárezsiz implementaciyasın ańsatlastırıw arqalı qorǵaydı. Lonchberi 1993 jalqaw bahalawdıń payda etetuǵın ayırım qıyınshılıqların, ásirese programmanıń saqlaw talapların analizlewde, táriyipleydi hám bunday analizge járdem beriw ushın operaciyalıq semantikanı usınadı. Xarper 2009 bir tilde qatań hám jalqaw bahalawdıń ekewin de qosıwdı, olardı ayırıw ushın tildiń tip sistemasın paydalanıwdı usınadı.

### Tip sistemaları
Ásirese 1970-jılları Xindli-Milner tip shıǵarıwı islep shıǵılǵannan berli, funkcional programmalastırıw tilleri tiplestirilgen lyambda esaplawın paydalanıwǵa beyim boldı, kompilyaciya waqtında barlıq jaramsız programmalardı biykar etip, jalǵan oń qátelerge táwekel etedi, bul Lisp hám onıń variantlarında (mısalı, Scheme) paydalanılatuǵın, kompilyaciya waqtında barlıq durıs programmalardı qabıl etip, jalǵan teris qátelerge táwekel etetuǵın tiplestirilmegen lyambda esaplawına qarama-qarsı, sebebi olar orınlanıw waqtında, informaciya durıs programmalardı biykar etpewge jetkilikli bolǵanda, barlıq jaramsız programmalardı biykar etedi. Algebralıq maǵlıwmat tiplerin paydalanıw quramalı maǵlıwmat strukturaların basqarıwdı qolaylı etedi; kúshli kompilyaciya waqtındaǵı tip tekseriwiniń bolıwı testke tiykarlanǵan islep shıǵıw sıyaqlı basqa isenimlilik usılları bolmaǵan jaǵdayda programmalardı isenimlirek etedi, al tip shıǵarıw baǵdarlamashını kóp jaǵdaylarda tiplerdi kompilyatorǵa qol menen járiyalaw mútájliginen azat etedi.

Rocq, Agda, Cayenne hám Epigram sıyaqlı ayırım izertlewge baǵdarlanǵan funkcional tiller intuicionistlik tip teoriyasına tiykarlanǵan, bul tiplerdiń termlerge ǵárezli bolıwına múmkinshilik beredi. Bunday tipler ǵárezli tipler dep ataladı. Bul tip sistemalarında sheshiletuǵın tip shıǵarıw joq hám olardı túsinip, programmalastırıw qıyın. Biraq ǵárezli tipler joqarı tártipli logikada qálegen usınıslardı ańlata aladı. Karri-Govard izomorfizmi arqalı, bul tillerdegi durıs tiplestirilgen programmalar rásmiy matematikalıq dálillerdi jazıw quralına aylanadı, olardan kompilyator sertifikatlanǵan kod generaciyalay aladı. Bul tiller tiykarınan akademiyalıq izertlewlerde (sonıń ishinde formallastırılǵan matematikada da) qızıǵıwshılıq oyatsa da, olar injenerlikte de qollanıla basladı. Compcert — bul Rocq-ta jazılǵan hám rásmiy tekserilgen C tiliniń bir bólimi ushın kompilyator.

Ulıwmalastırılǵan algebralıq maǵlıwmat tipleri (GADT) dep atalatuǵın ǵárezli tiplerdiń sheklengen forması, ǵárezli tiplestirilgen programmalastırıwdıń kóp qolaysızlıqlarınan saqlanıp, onıń ayırım paydaların usınatuǵın usılda ámelge asırılıwı múmkin. GADTlar Glasgow Haskell Compiler-de, OCaml-de hám Scala-da abar hám Java hám C# sıyaqlı basqa tillerge qosımshalar retinde usınılǵan.

### Siltemelik anıqlıq
Funkcional programmalar menshiklew operatorlarına iye emes, yaǵnıy funkcional programmadagı ózgeriwshiniń mánisi anıqlanǵannan keyin hesh qashan ózgermeydi. Bul qosımsha tásirlerdiń hár qanday múmkinshiligin joq etedi, sebebi hár qanday ózgeriwshini orınlanıwdıń qálegen noqatında onıń haqıyqıy mánisi menen almastırıwǵa boladı. Solay etip, funkcional programmalar siltemelik jaqtan anıq bolıp tabıladı.

C tilindegi x = x * 10 menshiklew operatorın kórip shıǵayıq, bul x ózgeriwshisine berilgen mánisti ózgertedi. Meyli, x-tıń dáslepki mánisi 1 edi, onda x ózgeriwshisin izbe-iz eki ret bahalaw 10 hám 100 nátiyjelerin beredi. Anıǵı, x = x * 10-dı 10 yamasa 100 benen almastırıw programmaǵa basqasha mánis beredi, sonlıqtan ańlatpa siltemelik jaqtan anıq emes. Haqıyqatında, menshiklew operatorları hesh qashan siltemelik jaqtan anıq emes.

Endi, int plusOne(int x) { return x + 1; } sıyaqlı basqa bir funkciyanı kórip shıǵayıq, ol anıq, sebebi ol kirgiziw x-ti tikkeley ózgertpeydi hám sonlıqtan bunday qosımsha tásirleri joq. Funkcional programmalar tek usı túrdegi funkciyalardı qollanadı hám sol sebepli siltemelik jaqtan anıq bolıp tabıladı.

### Maǵlıwmatlar strukturaları
Taza funkcional maǵlıwmatlar strukturaları kóbinese ózleriniń imperativ analoglarınan basqasha usılda kórsetiledi. Mısalı, turaqlı kiriw hám jańalaw waqtına iye massiv kóp imperativ tillerdiń tiykarǵı komponenti bolıp tabıladı hám xesh-keste hám binar úyindisi sıyaqlı kóp imperativ maǵlıwmatlar strukturaları massivlerge tiykarlanǵan. Massivlerdi taza funkcional implementaciyaǵa iye, biraq logarifmlik kiriw hám jańalaw waqtına iye bolǵan kartalar yamasa tosınnan kiriw dizimleri menen almastırıwǵa boladı. Taza funkcional maǵlıwmatlar strukturaları turaqlılıqqa iye, bul maǵlıwmatlar strukturasınıń aldınǵı versiyaların ózgertpey saqlaw qásiyeti. Clojure tilinde turaqlı maǵlıwmatlar strukturaları ózleriniń imperativ analoglarına funkcional alternativ retinde qollanıladı. Mısalı, turaqlı vektorlar bólek jańalaw ushın tereklerdi paydalanadı. Qosıw metodın shaqırıw barlıq túyinlerdiń emes, al ayırımlarınıń jaratılıwına alıp keledi.

## Imperativ programmalastırıw menen salıstırıw
Funkcional programmalastırıw imperativ programmalastırıwdan aytarlıqtay ózgeshe. Eń áhmiyetli ayırmashılıqlar funkcional programmalastırıwdıń imperativ programmalastırıwda jaǵdaydı hám kirgiziw/shıǵarıwdı ámelge asırıw ushın qollanılatuǵın qosımsha tásirlerden saqlanıwınan kelip shıǵadı. Taza funkcional programmalastırıw qosımsha tásirlerdi tolıq boldırmaydı hám siltemelik anıqlıqtı támiyinleydi.

Joqarı tártipli funkciyalar eski imperativ programmalastırıwda siyrek qollanıladı. Dástúrli imperativ programma dizimdi aylanıp shıǵıw hám ózgertiw ushın cikldi paydalanıwı múmkin. Ekinshi tárepten, funkcional programma, itimal, funkciyanı hám dizimdi qabıl etip, funkciyanı hárbir dizim elementine qollanıw arqalı jańa dizim payda etetuǵın hám qaytaratuǵın joqarı tártipli «map» funkciyasın paydalanadı.

### Imperativ hám funkcional programmalastırıw
Tómendegi eki mısal (Java tilinde jazılǵan) birdey nátiyjege erisedi: olar massivtegi barlıq jup sanlardı 10-ǵa kóbeytedi hám olardıń hámmesin qosadı, aqırǵı qosındını result ózgeriwshisinde saqlaydı.

Dástúrli imperativ cikl:
```java
int[] numList = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int result = 0;
for (int i: numList) {
    if (i % 2 == 0) {
        result += i * 10;
    }
}
```
Joqarı tártipli funkciyalar menen funkcional programmalastırıw:
```java
import java.util.Arrays;

int[] numList = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int result = Arrays.stream(numList)
    .filter(n -> n % 2 == 0)
    .map(n -> n * 10)
    .reduce(0, Integer::sum);
```
Geyde funkcional programmalastırıw usınǵan abstrakciyalar úlken kólemdegi quramalı, imperativ kodqa tiykarlanǵan jaǵdayda payda bolıwı múmkin bolǵan belgili bir máselelerden, mısalı, birden qátelesiw (Greenspun-nıń onınshı qaǵıydasın qarań) sıyaqlı máselelerden saqlanatuǵın isenimlirek kodtıń rawajlanıwına alıp keliwi múmkin.

### Jaǵdaydı simulyaciyalaw
Geyde bank esabınıń balansın saqlaw sıyaqlı wazıypalar eń tábiyiy túrde jaǵday menen ámelge asırılatuǵınday kórinse de. Taza funkcional programmalastırıw bul wazıypalardı hám paydalanıwshı kirgiziwin qabıl etiw hám ekranǵa shıǵarıw sıyaqlı kirgiziw/shıǵarıw wazıypaların basqasha usılda orınlaydı.

Taza funkcional programmalastırıw tili Haskell olardı kategoriya teoriyasınan alınǵan monadlar arqalı ámelge asıradı. Monadlar belgili bir túrdegi esaplaw úlgilerin, sonıń ishinde (biraq olar menen sheklenbey) ózgermeli jaǵday menen esaplawlardı (hám kirgiziw/shıǵarıw sıyaqlı basqa qosımsha tásirlerdi) tazalıqtı saqlap qalǵan jaǵdayda imperativ usılda modellestiriw usılın usınadı. Bar monadlardı tiyisli shablonlar hám mısallar berilgen jaǵdayda programmada qollanıw ańsat bolıwı múmkin bolsa da, kóp studentler olardı konceptual túsinip alıwda qıynaladı, mısalı, jańa monadlardı anıqlaw soralǵanda (bul geyde belgili bir túrdegi kitapxanalar ushın kerek boladı).

Funkcional tiller sonday-aq ózgermeytuǵın jaǵdaylardı aylanıp jiberiw arqalı da jaǵdaylardı simulyaciyalaydı. Bunı funkciyanıń jaǵdaydı óz parametrleriniń biri retinde qabıl etip, eski jaǵdaydı ózgertpey qaldırıp, nátiyje menen birge jańa jaǵdaydı qaytarıwı arqalı islewge boladı.

Taza emes funkcional tiller ádette ózgermeli jaǵdaydı basqarıwdıń tikkeleyirek usılın óz ishine aladı. Mısalı, Clojure házirgi jaǵdayǵa taza funkciyalardı qollanıw arqalı jańalanıwı múmkin bolǵan basqarılatuǵın siltemelerdi qollanadı. Bunday usıl taza funkciyalardı esaplawlardı ańlatıwdıń eń jaqsı usılı retinde xoshametlep turıp, ózgermelilikke múmkinshilik beredi.

Programmalardaǵı qosımsha tásirlerdi baqlaw ushın Xoar logikası hám unikalıq sıyaqlı alternativ usıllar islep shıǵılǵan. Ayırım zamanagóy izertlew tilleri qosımsha tásirlerdiń bar ekenligin anıq kórsetiw ushın tásir sistemaların qollanadı.

### Ónimdarlıq máseleleri
Funkcional programmalastırıw tilleri ádette C hám Pascal sıyaqlı imperativ tillerge qaraǵanda CPU hám yadtı paydalanıwda kemirek ónimli boladı. Bul massivler sıyaqlı ayırım ózgermeli maǵlıwmatlar strukturalarınıń házirgi apparatlıq támiynattı paydalanıp júdá ápiwayı implementaciyaǵa iye bolıwı menen baylanıslı. Tegis massivlerge tereń konveyerlengen OPUlar menen júdá ónimli kiriwge, keshler arqalı ónimli aldınnan júklewge (quramalı kórsetkish izlewlersiz) yamasa SIMD kórsetpeleri menen qayta islewge boladı. Olardıń teń dárejede ónimli ulıwma maqsetli ózgermeytuǵın analogların jaratıw da ańsat emes. Taza funkcional tiller ushın eń jaman jaǵdaydaǵı ástelew paydalanılǵan yad kletkalarınıń sanına logarifmlik boladı, sebebi ózgermeli yad logarifmlik kiriw waqtına iye taza funkcional maǵlıwmatlar strukturası (mısalı, teńlestirilgen terek) menen kórsetiliwi múmkin. Biraq, bunday ástelewler ulıwmalıq emes. Intensiv sanlı esaplawlardı orınlaytuǵın programmalar ushın OCaml hám Clean sıyaqlı funkcional tiller Kompyuter Tilleri Benchmarks Oyınına sáykes C-dan tek sál ǵana áste. Úlken matricialar menen kóp ólshemli maǵlıwmatlar bazaların qayta isleytuǵın programmalar ushın massivli funkcional tiller (mısalı, J hám K) tezlikti optimallastırıw menen proektlestirilgen.

Maǵlıwmatlardıń ózgermewi kóp jaǵdaylarda kompilyatorǵa imperativ tilde qáwipsiz bolmaǵan boljawlar jasawǵa múmkinshilik beriw arqalı orınlanıw nátiyjeligine alıp keliwi múmkin, solay etip qatar ishindegi keńeytiw múmkinshiliklerin arttıradı. Turaqlı ózgermeytuǵın maǵlıwmatlar strukturaları menen isleskende tikkeley emes kóriniske iye bolıwı múmkin bolǵan kóshiriw esaplaw jaǵınan qımbat bolıp kórinse de, Clojure sıyaqlı ayırım funkcional programmalastırıw tilleri rásmiy ózgermeytuǵın maǵlıwmatlar arasında qáwipsiz yad bólisiw mexanizmlerin ámelge asırıw arqalı bul máseleni sheshedi. Rust ózgermeytuǵın siltemeler hám ómirler dep atalatuǵın túsinikti óz ishine alǵan maǵlıwmatlardıń ózgermewine kózqarası menen ajıralıp turadı.

Sáykeslik hám jaǵdaydıń bóliniwi hám birge paydalanılmaytuǵın sxemaları bar ózgermeytuǵın maǵlıwmatlar da belgili bir parallel qáwiplerdiń qáwpin azaytıw yamasa joq etiw arqalı parallel programmalastırıw ushın kóbirek sáykes keliwi múmkin, sebebi parallel operaciyalar ádette atomar boladı hám bul qulıplarǵa bolǵan mútájlikti joq etiwge múmkinshilik beredi. Mısalı, java.util.concurrent klasları usılay ámelge asırılǵan, olardıń ayırımları parallel paydalanıwǵa sáykes kelmeytuǵın tiyisli klaslardıń ózgermeytuǵın variantları bolıp tabıladı. Funkcional programmalastırıw tilleriniń kóbinese ortaq jaǵday hám sinxronizaciya ornına xabar jiberiw mexanizmlerin (mısalı, hárbir aktyor jaǵday, minez-qulıq, balalıq aktyorlar hám xabarlar gezegi ushın konteyner bolǵan aktyor modeli) paydalanatuǵın parallel modeli bar. Bul usıl Erlang/Elixir yamasa Akka da keń tarqalǵan.

Jalqaw bahalaw programmanı asimptotikalıq túrde de tezletiw múmkin, al eń kóp degende onı turaqlı faktorǵa ásteletiw múmkin (biraq, nadurıs paydalanılsa, yad aǵıwlarına alıp keliwi múmkin). Lonchberi 1993 jalqaw bahalawdan kelip shıǵatuǵın yad aǵıwı menen baylanıslı teoriyalıq máselelerdi talqılaydı, al O'Sallivan hám basqalar 2008 olardı analizlew hám dúzetiw ushın ayırım ámeliy keńesler beredi. Biraq, siltemesizlendirilgen kod hám maǵlıwmatlardı keńnen paydalanatuǵın jalqaw bahalawdıń eń ulıwma implementaciyaları tereń konveyerli hám kóp dárejeli keshli zamanagóy processorlarda tómen ónimdarlıq kórsetedi (bul jerde keshte qátelik júzlegen ciklge teń bolıwı múmkin).

#### Abstrakciya bahası
Ayırım funkcional programmalastırıw tilleri «map» yamasa «filter» sıyaqlı joqarı dárejeli funkciyalar sıyaqlı abstrakciyalardı tiykarǵı imperativ operaciyalar sıyaqlı nátiyjeli optimallastırmawı múmkin. Mısal retinde, Clojure tilinde 5 sanınıń jup ekenligin tekseriwdiń tómendegi eki usılın qarap shıǵayıq:
```clojure
(even? 5)
(.equals (mod 5 2) 0)
```
Leiningen REPL 2.11.2, Java VM 22 versiyasında hám Clojure 1.11.1 versiyasında islep turǵan Ryzen 7900X GNU/Linux kompyuterinde Criterium quralı menen benchmark etilgende, tómendegishe ámelge asırılǵan birinshi implementaciyanıń:
```clojure
(defn even?
  "Returns true if n is even, throws an exception if n is not an integer"
  {:added "1.0"
   :static true}
   [n] (if (integer? n)
        (zero? (bit-and (clojure.lang.RT/uncheckedLongCast n) 1))
        (throw (IllegalArgumentException. (str "Argument must be an integer: " n)))))
```
ortasha orınlanıw waqtı 4.76 ms, al .equals tiykarındaǵı Java metodınıń tikkeley shaqırıwı bolǵan ekinshi implementaciyanıń ortasha orınlanıw waqtı 2.8 μs – shama menen 1700 ese tezirek. Bunıń bir bólegi even? implementaciyasındaǵı tip tekseriw hám qátelerdi qayta islewge baylanıslı bolıwı múmkin. Mısalı, Go ushın lo kitapxanası funkcional programmalastırıw tillerinde keń tarqalǵan hár túrli joqarı dárejeli funkciyalardı djenerikler arqalı ámelge asıradı. Kitapxana avtorı tárepinen usınılǵan benchmarkta, map-tı shaqırıw ekvivalent for ciklınan 4% ásterek hám birdey bóliniw profiline iye, bunı qatar ishindegi keńeytiw sıyaqlı hár túrli kompilyator optimallastırıwları menen túsindiriwge boladı.

Rust-tıń bir ayrıqsha ózgesheligi – nol bahalı abstrakciyalar. Bul olardı paydalanıw qosımsha orınlanıw waqtındaǵı shıǵınlarǵa alıp kelmeytuǵının ańlatadı. Buǵan kompilyatordıń cikl ashıwın paydalanıwı arqalı erisiledi, bunda cikldiń hárbir iteraciyası, ol imperativ bolsın yamasa iteratorlar arqalı bolsın, cikldi basqarıwshı kodtıń artıqsha shıǵınısız, bólek Assembler kórsetpesine aylandırıladı. Eger iterativ operaciya massivke jazsa, nátiyjedegi massivtiń elementleri belgili bir OPU registrlerinde saqlanadı, bul orınlanıw waqtında turaqlı waqıtta kiriwge múmkinshilik beredi.

### Funkcional emes tillerde funkcional programmalastırıw
Dástúrli túrde funkcional emes dep esaplanatuǵın tillerde de funkcional programmalastırıw stilin qollanıw múmkin. Mısalı, D hám Fortran 95 tilleriniń ekewi de taza funkciyalardı anıq qollap-quwatlaydı.

JavaScript, Lua, Python hám Go tillerinde birinshi dárejeli funkciyalar olardıń payda bolǵanınan baslap bar. Python 1994-jılı «lambda», «map», «reduce» hám «filter»-di, sonday-aq Python 2.2-de jabılıwlardı qollap-quwatlaǵan, biraq Python 3 «reduce»-ti functools standart kitapxana modulına ótkizgen. Birinshi dárejeli funkciyalar Perl 5.0 (1994), PHP 5.3, Visual Basic 9, C# 3.0, C++11 hám Kotlin sıyaqlı basqa da tiykarǵı tillerge kirgizilgen.

Perl tilinde lambda, map, reduce, filter hám jabılıwlar tolıq qollap-quwatlanadı hám jiyi qollanıladı. 2005-jılı shıǵarılǵan Higher-Order Perl kitabı Perl-di funkcional programmalastırıw ushın paydalanıw boyınsha keń kólemli qollanba usınıw ushın jazılǵan.

PHP-de anonim klaslar, jabılıwlar hám lambdalar tolıq qollap-quwatlanadı. Funkcional stilde programmalastırıwǵa járdem beriw ushın ózgermeytuǵın maǵlıwmatlar strukturaları ushın kitapxanalar hám til keńeytpeleri islep shıǵarılmaqta.

Java tilinde anonim klaslar geyde jabılıwlardı simulyaciyalaw ushın paydalanılıwı múmkin; biraq, anonim klaslar bárqulla jabılıwlardıń durıs almastırıwshısı emes, sebebi olardıń múmkinshilikleri sheklengen. Java 8 ayırım anonim klaslardı almastırıw ushın lambda ańlatpaların qollap-quwatlaydı.

C# tilinde anonim klaslar kerek emes, sebebi jabılıwlar hám lambdalar tolıq qollap-quwatlanadı. C#-ta funkcional stilde programmalastırıwǵa járdem beriw ushın ózgermeytuǵın maǵlıwmatlar strukturaları ushın kitapxanalar hám til keńeytpeleri islep shıǵarılmaqta.

Kóplegen obyektke baǵdarlanǵan proektlestiriw úlgileri funkcional programmalastırıw terminleri menen ańlatılıwı múmkin: mısalı, strategiya úlgisi ápiwayı ǵana joqarı dárejeli funkciyanı paydalanıwdı talap etedi, al vizitor shablonı shama menen katamorfizmge yamasa búgiwge sáykes keledi.

Sol sıyaqlı, funkcional programmalastırıwdan alınǵan ózgermeytuǵın maǵlıwmatlar ideyası imperativ programmalastırıw tillerine de kóbinese kirgiziledi, mısalı, Pythondaǵı ózgermeytuǵın massiv bolǵan tuple hám JavaScripttegi Object.freeze().

## Logikalıq programmalastırıw menen salıstırıw
Logikalıq programmalastırıwdı funkcional programmalastırıwdıń ulıwmalastırılǵan forması retinde qarawǵa boladı, onda funkciyalar qatnaslardıń arnawlı bir jaǵdayı bolıp tabıladı.
Mısalı, mother(X) = Y funkciyası (hárbir X-tiń tek bir ǵana anası Y bar) mother(X, Y) qatnası arqalı kórsetiliwi múmkin. Funkciyalardıń qatań kirgiziw-shıǵarıw argumentler úlgisi bar bolsa, qatnaslar qálegen kirgiziw hám shıǵarıw úlgisi menen soralıwı múmkin. Tómendegi logikalıq programmanı qarap shıǵayıq:
```prolog
mother(charles, elizabeth).
mother(harry, diana).
```
Programmanı, funkcional programma sıyaqlı, balalardan analardı generaciyalaw ushın sorawǵa boladı:
```prolog
?- mother(harry, X).
X = diana.
?- mother(charles, X).
X = elizabeth.
```
Biraq onı balalardı generaciyalaw ushın keri sorawǵa da boladı:
```prolog
?- mother(X, elizabeth).
X = charles.
?- mother(X, diana).
X = harry.
```
Onı hátte ana qatnasınıń barlıq jaǵdayların generaciyalaw ushın da paydalanıwǵa boladı:
```prolog
?- mother(X, Y).
X = charles,
Y = elizabeth.
X = harry,
Y = diana.
```
Qatnas sintaksisine salıstırǵanda, funkcional sintaksis ishki funkciyalar ushın qolaylıraq belgileniw bolıp tabıladı. Mısalı, funkcional sintaksistegi ana tárepten ájeniń anıqlamasın ishki formada jazıwǵa boladı:
```prolog
maternal_grandmother(X) = mother(mother(X)).
```
Qatnas belgilewindegi sol anıqlamanı ishki emes formada jazıw kerek:
```prolog
maternal_grandmother(X, Y) :- mother(X, Z), mother(Z, Y).
```
Bul jerde :- eger degen mánisti bildiredi, al , hám degen mánisti bildiredi.

Biraq, eki kórsetiw arasındaǵı ayırmashılıq tek ǵana sintaksislik. Ciao Prolog-ta, funkcional programmalastırıwdaǵı funkciyalar sıyaqlı, qatnaslardı ishki jaylastırıwǵa boladı:
```prolog
grandparent(X) := parent(parent(X)).
parent(X) := mother(X).
parent(X) := father(X).

mother(charles) := elizabeth.
father(charles) := phillip.
mother(harry) := diana.
father(harry) := charles.

?- grandparent(X,Y).
X = harry,
Y = elizabeth.
X = harry,
Y = phillip.
```
Ciao funkciyaǵa uqsas belgilewdi qatnas formasına aylandıradı hám nátiyjedegi logikalıq programmanı standart Prolog orınlanıw strategiyasın paydalanıp orınlaydı.

## Qollanılıwı

### Tekst redaktorları
Emacs, júdá keńeytiletuǵın tekst redaktorları shańaraǵı, plaginler jazıw ushın óziniń Lisp dialektin paydalanadı. Eń ataqlı Emacs implementaciyası GNU Emacs hám Emacs Lisp-tiń dáslepki avtorı Richard Stallman Lispti óziniń eń súyikli programmalastırıw tilleriniń biri dep esaplaydı.

Helix, 24.03 versiyasınan baslap AST-ni S-ańlatpaları retinde aldınnan kóriwdi qollap-quwatlaydı, olar sonday-aq Lisp programmalastırıw tilleri shańaraǵınıń tiykarǵı ózgesheligi bolıp tabıladı.

### Elektron kesteler
Elektron kestelerdi taza, nolinshi dárejeli, qatań bahalanatuǵın funkcional programmalastırıw sistemasınıń bir forması retinde qarawǵa boladı. Biraq, elektron kestelerde ádette joqarı tártipli funkciyalar hám de kodtı qayta paydalanıw jetispeydi, al ayırım implementaciyalarda rekursiya da joq. Elektron keste programmaları ushın joqarı tártipli hám qayta paydalanılatuǵın funkciyalardı qosıwǵa múmkinshilik beretuǵın bir neshe keńeytpeler islep shıǵılǵan, biraq házirshe olar tiykarınan akademiyalıq xarakterge iye bolıp qalmaqta.

### Mikroservisler
Kompoziciyalıq qásiyeti sebepli, funkcional programmalastırıw paradigmaları mikroservislerge tiykarlanǵan arxitekturalar ushın sáykes keliwi múmkin.

### Akademiya
Funkcional programmalastırıw programmalastırıw tilleri teoriyası tarawında aktiv izertlew tarawı bolıp tabıladı. Funkcional programmalastırıwǵa arnalǵan bir neshe recenziyalanatuǵın baspalar bar, sonıń ishinde Xalıqaralıq Funkcional Programmalastırıw Konferenciyası (International Conference on Functional Programming), Funkcional Programmalastırıw Jurnalı (Journal of Functional Programming) hám Funkcional Programmalastırıwdaǵı Tendenciyalar Simpoziumı (Symposium on Trends in Functional Programming).

### Sanaat
Funkcional programmalastırıw keń kólemli sanaat qollanıwlarında paydalanılǵan. Mısalı, 1980-jıllardıń aqırında Shveciyanıń Ericsson kompaniyası tárepinen islep shıǵılǵan Erlang, dáslep qátege shıdamlı telekommunikaciya sistemaların ámelge asırıw ushın qollanılǵan, biraq sonnan berli Nortel, Facebook, Électricité de France hám WhatsApp sıyaqlı kompaniyalarda hár túrli qosımshalar dúziw ushın ataqlı bolıp ketti. Lisptiń bir dialekti bolǵan Scheme, dáslepki Apple Macintosh kompyuterlerindegi bir neshe qosımshalardıń tiykarı retinde qollanılǵan hám oqıw-simulyaciya programmalıq támiynatı hám teleskoptı basqarıw sıyaqlı máselelerge qollanılǵan. 1990-jıllardıń ortasında usınılǵan OCaml, finanslıq analiz, drayverlerdi tekseriw, sanaat robotların programmalastırıw hám ornatılǵan programmalıq támiynattı statikalıq analizlew sıyaqlı tarawlarda kommerciyalıq qollanıwǵa iye boldı. Haskell, dáslep izertlew tili retinde jobalastırılǵan bolsa da, aerokosmoslıq sistemalar, apparatlıq támiynattı proektlestiriw hám veb-programmalastırıw sıyaqlı tarawlarda da qollanılǵan.

Sanaatta qollanılǵan basqa funkcional programmalastırıw tillerine Scala, F#, Wolfram Language, Lisp, Standard ML hám Clojure kiredi. Scala maǵlıwmatlar iliminde keńnen qollanılǵan, al ClojureScript, Elm yamasa PureScript islep shıǵarıwda qollanılatuǵın ayırım funkcional frontend programmalastırıw tilleri bolıp tabıladı. Elixir-diń Phoenix freymvorkı sonday-aq Font Awesome yamasa Allegro (Polshadaǵı eń úlken elektron kommerciya platformalarınıń biri)-nıń járiyalaw platforması Allegro Lokalnie sıyaqlı ayırım salıstırmalı túrde ataqlı kommerciyalıq proektlerde de qollanıladı.

Funkcional «platformalar» finansta risk analizi ushın (ásirese úlken investiciyalıq banklerde) ataqlı bolǵan. Risk faktorları bazar ózgerislerindegi korrelyaciyalardı ólshew ushın bir-birine ǵárezli graflar (kategoriyalar) dúzetuǵın funkciyalar retinde kodlanadı, bul usılı boyınsha Gryobner bazası optimallastırıwlarına uqsas, biraq sonday-aq Keń kólemli Kapital Analizi hám Sholıw sıyaqlı tártipke salıwshı sheńberler ushın da qollanıladı. Finansta OCaml hám Caml variaciyalarınıń qollanılıwın esapqa alǵanda, bul sistemalar geyde kategoriyalıq abstrakt mashinaǵa baylanıslı dep esaplanadı. Funkcional programmalastırıw kategoriyalar teoriyasınıń kúshli tásirinde bolǵan.

### Bilimlendiriw
Kóplegen universiteler funkcional programmalastırıwdı oqıtadı. Ayırımları onı kirisiw programmalastırıw túsinigi retinde qarasa, basqaları dáslep imperativ programmalastırıw usılların oqıtadı.

Kompyuter iliminen tıs, funkcional programmalastırıw máselelerdi sheshiw, algebralıq hám geometriyalıq túsiniklerdi úyretiw ushın qollanıladı. Ol sonday-aq «Klassikalıq Mexanikanıń Strukturası hám Interpretaciyası» kitabındaǵı sıyaqlı, klassikalıq mexanikanı úyretiw ushın da qollanılǵan.

Ásirese, Scheme jıllar dawamında programmalastırıwdı oqıtıw ushın salıstırmalı túrde ataqlı tańlaw bolıp kelgen.

## Derekler

__BÖLİDİMÖNDEMEW__