functional programming
Főnév
functional programming (tsz. functional programmings)
A funkcionális programozás (angolul: functional programming) egy programozási paradigma, amelyben a programokat függvények kombinációjaként írjuk meg. Ezek a függvények matematikai értelemben vett tiszták, azaz nincsenek mellékhatásaik, és nem módosítanak állapotot. A funkcionális programozás az algoritmusokat és adattranszformációkat helyezi a középpontba, nem az utasításokat és a vezérlést.
Ez a szemlélet szorosan kapcsolódik a lambda-kalkulushoz, amely a 20. században a formális logika részeként jött létre, és ma is a funkcionális nyelvek matematikai alapját képezi.
A funkcionális programozás alapelvei
- Tiszta függvények (pure functions)
- Mindig ugyanazt az eredményt adják ugyanazzal a bemenettel.
- Nincsenek mellékhatások (pl. nem írnak fájlba, nem módosítanak globális változókat).
- Állapotmentesség (statelessness)
- Nincs változó értékek módosítása, csak új értékek létrehozása (immutabilitás).
- Függvények elsőrendű entitásokként
- A függvények átadhatók, visszaadhatók, tárolhatók változókban.
- Rekurzió a ciklusok helyett
- Mivel nincs állapotváltozás, a rekurzió a fő vezérlési mechanizmus.
- Magasabbrendű függvények (higher-order functions)
- Függvényeket fogadnak paraméterként, vagy visszaadnak eredményként.
- Deklaratív stílus
- A „mit” írjuk le, nem a „hogyan”-t. (pl.
map,filter,reduce)
- A „mit” írjuk le, nem a „hogyan”-t. (pl.
Funkcionális programozási nyelvek
| Funkcionális nyelv | Jellemzők |
|---|---|
| Haskell | Tiszta, erősen típusos, lazy értékelés |
| Lisp / Scheme | Reprezentatív funkcionális nyelvcsalád |
| OCaml / F# | Funkcionális + imperatív hibrid |
| Erlang | Elosztott rendszerekhez, párhuzamos |
| Elixir | Modern nyelv, Erlangra épül |
| Scala | Java-kompatibilis, funkcionális és objektumorientált is |
| Python, JavaScript | Támogat funkcionális elemeket (pl. map, lambda) |
Példák
1. Tiszta függvény (Python-ban)
def square(x):
return x * x
2. Magasabbrendű függvény: map
numbers = [1, 2, 3, 4]
squared = list(map(lambda x: x * x, numbers))
3. Rekurzió (összegzés)
def sum_recursive(lst):
if not lst:
return 0
return lst[0] + sum_recursive(lst[1:])
4. Haskell példa
square x = x * x
sumList [] = 0
sumList (x:xs) = x + sumList xs
Előnyök
| Előny | Magyarázat |
|---|---|
| Könnyen tesztelhető | A tiszta függvények kiszámíthatók. |
| Párhuzamos végrehajtásra alkalmas | Mivel nincs osztott állapot. |
| Rövidebb, elegánsabb kód | A magasabb rendű függvények és immutabilitás révén. |
| Nincs mellékhatás | Így kevesebb rejtett hiba lehetőség. |
| Matematikai alaposság | Könnyebb formális ellenőrzés, verifikáció. |
Hátrányok
| Hátrány | Magyarázat |
|---|---|
| Nehéz lehet megszokni | Imperatív gondolkodásmód után nehéz váltani. |
| Lassabb lehet bizonyos esetekben | Mivel új értékeket hozunk létre (memóriahasználat). |
| Rekurziók korlátai | Stack overflow veszélye hosszú rekurzióknál. |
| Kevés ipari tapasztalat | Az imperatív paradigmák dominálnak a piacon. |
Tipikus funkcionális műveletek
| Függvény | Működés |
|---|---|
map(f, L) |
Alkalmazza az f függvényt a L lista elemeire. |
filter(f, L) |
Csak azokat az elemeket tartja meg, amelyekre f(x) igaz. |
reduce(f, L) |
Egyesíti az elemeket az f függvénnyel (összeg, szorzat stb.). |
zip(L1, L2) |
Összepárosítja a két listát. |
lambda x: ... |
Névtelen függvény. |
Összehasonlítás más paradigmákkal
| Paradigma | Jellemző |
|---|---|
| Imperatív | Lépésről lépésre utasításokat ad (pl. C, Python) |
| Objektumorientált | Osztályok, objektumok, öröklés, kapszulázás |
| Funkcionális | Függvények, deklaratív leírás, tiszta működés |
Funkcionális programozás a gyakorlatban
- Adattranszformáció (pl. adatfolyamok feldolgozása Spark-kal)
- Webfejlesztés (pl. Elixir + Phoenix)
- Párhuzamos rendszerek (Erlang – telefóniában használt)
- Adatfeldolgozás (pl. Pandas
apply,map) - Reaktív programozás (RxJS, ReactiveX)
Összegzés
A funkcionális programozás egy matematikai alapokra épülő, tiszta, deklaratív szemlélet, amely lehetővé teszi, hogy a programokat függvények kompozíciójaként kezeljük. Ez a megközelítés hatékony a hibamentes, párhuzamos, újrafelhasználható és könnyen karbantartható szoftverek írásához. Noha ipari alkalmazása kevésbé elterjedt, mint az objektumorientált programozásé, a funkcionális elemek egyre inkább megjelennek hibrid nyelvekben és modern szoftverkeretrendszerekben.
- functional programming - Szótár.net (en-hu)
- functional programming - Sztaki (en-hu)
- functional programming - Merriam–Webster
- functional programming - Cambridge
- functional programming - WordNet
- functional programming - Яндекс (en-ru)
- functional programming - Google (en-hu)
- functional programming - Wikidata
- functional programming - Wikipédia (angol)