Funkcinis programavimas

   Šiam straipsniui ar jo daliai trūksta išnašų į patikimus šaltinius.
Jūs galite padėti Vikipedijai pridėdami tinkamas išnašas su šaltiniais.

Funkcinis programavimas – tai programavimo paradigma, kai programos konstruojamos taikant ir sudarant funkcijas. Tai deklaratyvi programavimo paradigma, kurioje funkcijų apibrėžimai yra išraiškų medžiai, susiejantys reikšmes su kitomis reikšmėmis, o ne imperatyvių teiginių, atnaujinančių programos veikimo būseną, seka.

Funkcinį programavimą realizuojančios kalbos: Lisp, Elixir, Erlang, Haskell ir kt.

Istorija

redaguoti

Lambda skaičiavimas, kurį XX amžiaus trečiajame dešimtmetyje sukūrė Alonzo Church, yra formali skaičiavimo sistema, sukurta naudojant funkcijų programą. 1937 m. Alan Turing įrodė, kad lambda skaičiavimas ir Tiuringo mašinos yra lygiaverčiai skaičiavimo modeliai, parodydami, kad lambda skaičiavimas yra baigtas Tiuringo skaičiavimu. Lambda skaičiavimas yra visų funkcinių programavimo kalbų pagrindas. Lygiavertę teorinę formuluotę, kombinatorinę logiką sukūrė Moses Schönfinkel ir Haskell Curry 1920 ir 1930 metais.

Palyginimas su imperatyviuoju programavimu

redaguoti

Funkcinis programavimas labai skiriasi nuo imperatyviojo. Pagrindinis skirtumas gali buti įvardijamas tuo, kad funkcinis programavimas neturi šalutinių poveikių (eng. side effects), kurie naudojami imperatyviajame programavime, norint realizuoti aplikacijos buseną (eng. state) ir įvesties/išvesties metodus. Funkcinis programavimas apsaugo nuo šalutinių poveikių ir užtikrina saugumą.

Senesnės funkcines programavimo kalbos retai naudoja aukštesnės eilės (eng. higher-order) funkcijas. Tradicinė imperatyvi programa gali naudoti ciklą, tam kad pereiti/modifikuoti sąrašus. Tačiau funkcinė programavimo kalba greičiausiai naudotųsi aukštesnės eilės funkcijas, kurios paima funkciją ir sąrašą, generuoja bei grąžina naują sąrašą, pritaikydamos šią funkcija kiekvienam sąrašo elementui.

Kodo palyginimas

redaguoti

Šie du pavyzdžiai, parašyti Javascript programavimo kalba, sprendžia tą pačią problemą - padaugina visus lyginius skaičius masyve (eng. array) iš 10, ir sudeda juos į vieną sumą, pavadinta `rezultatu`.

Tradicinis imperatyvus ciklas:

const sarasas = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
let rezultatas = 0;

for (let i = 0; i < sarasas.length; i++) {
  if (sarasas[i] % 2 === 0) {
    rezultatas += sarasas[i] * 10;
  }
}

Funkcinis programavimas, su aukštesnės eilės (higher-order) funkcijomis.

const rezultatas = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
  .filter(n => n % 2 === 0)
  .map(a => a * 10)
  .reduce((a, b) => a + b, 0);

Kartais šios abstrakcijos (eng. abstractions) siųlomos funkcinio programavimo padaro koda skaitomesnį, bei palieka mažiau vietos klaidoms, nei rašant imperatyviuoju būdu.