Introducció
La programació funcional és un paradigma de programació en el qual intentem lligar-ho tot amb un estil pur de funcions matemàtiques. És un tipus d'estil de programació declaratiu. El seu enfocament principal és el que s'ha de resoldre, en contrast amb un estil imperatiu on l'enfocament principal és com resoldre. Utilitza expressions en lloc d'enunciats. Una expressió s'avalua per produir un valor mentre que una instrucció s'executa per assignar variables. Aquestes funcions tenen algunes característiques especials que es discuteixen a continuació.
La programació funcional es basa en el càlcul Lambda:
El càlcul lambda és un marc desenvolupat per Alonzo Church per estudiar càlculs amb funcions. Es pot dir que és el llenguatge de programació més petit del món. Dóna la definició del que és computable. Qualsevol cosa que es pugui calcular mitjançant càlcul lambda és computable. És equivalent a la màquina de Turing en la seva capacitat de calcular. Proporciona un marc teòric per descriure les funcions i la seva avaluació. Constitueix la base de gairebé tots els llenguatges de programació funcionals actuals.
Fet: Alan Turing va ser un estudiant d'Alonzo Church que va crear la màquina Turing que va establir les bases de l'estil de programació imperatiu.
Llenguatges de programació compatibles amb la programació funcional: Haskell, JavaScript, Python, Scala, Erlang, Lisp, ML, Clojure, OCaml, Common Lisp, Racket.
prova de capturar en java
Conceptes de programació funcional:
- Funcions pures
- Recursió Transparència referencial Les funcions són de primera classe i poden ser d'ordre superior Les variables són immutables
Funcions pures: Aquestes funcions tenen dues propietats principals. En primer lloc, sempre produeixen la mateixa sortida per als mateixos arguments independentment de qualsevol altra cosa.
En segon lloc, no tenen efectes secundaris, és a dir, no modifiquen cap argument ni variable local/global o flux d'entrada/sortida.
La propietat posterior s'anomena immutabilitat. L'únic resultat de la funció pura és el valor que retorna. Són deterministes.
Els programes fets amb programació funcional són fàcils de depurar perquè les funcions pures no tenen efectes secundaris ni E/S oculta. Les funcions pures també faciliten l'escriptura d'aplicacions paral·leles/concurrents. Quan el codi s'escriu amb aquest estil, un compilador intel·ligent pot fer moltes coses: pot paral·lelitzar les instruccions, esperar a avaluar els resultats quan els necessiti i memoritzar els resultats, ja que els resultats no canvien mai mentre l'entrada no canviï.
exemple de la funció pura:
sum(x, y) // sum is function taking x and y as arguments return x + y // sum is returning sum of x and y without changing them>
Recursió: No hi ha bucle for ni while en llenguatges funcionals. La iteració en llenguatges funcionals s'implementa mitjançant recursivitat. Les funcions recursives es diuen repetidament a si mateixes, fins que arriben al cas base.
exemple de la funció recursiva:
fib(n) if (n <= 1) return 1; else return fib(n - 1) + fib(n - 2);>
Transparència referencial: En els programes funcionals, les variables un cop definides no canvien el seu valor al llarg del programa. Els programes funcionals no tenen declaracions d'assignació. Si hem d'emmagatzemar algun valor, definim noves variables. Això elimina qualsevol possibilitat d'efectes secundaris perquè qualsevol variable es pot substituir pel seu valor real en qualsevol punt d'execució. L'estat de qualsevol variable és constant en qualsevol instant.
Exemple:
x = x + 1 // this changes the value assigned to the variable x. // So the expression is not referentially transparent.>
Les funcions són de primera classe i poden ser d'ordre superior: Les funcions de primera classe es tracten com a variables de primera classe. Les variables de primera classe es poden passar a funcions com a paràmetre, es poden retornar des de les funcions o emmagatzemar-se en estructures de dades. Les funcions d'ordre superior són les funcions que prenen altres funcions com a arguments i també poden retornar funcions.
q1 q2 q3 q4
Exemple:
show_output(f) // function show_output is declared taking argument f // which are another function f(); // calling passed function print_gfg() // declaring another function print('hello gfg'); show_output(print_gfg) // passing function in another function> Les variables són immutables: En la programació funcional, no podem modificar una variable després d'haver-la inicialitzat. Podem crear noves variables, però no podem modificar les existents, i això realment ajuda a mantenir l'estat durant tot el temps d'execució d'un programa. Un cop creem una variable i establim el seu valor, podem tenir plena confiança sabent que el valor d'aquesta variable mai canviarà.
Avantatges i inconvenients de la programació funcional
Avantatges:
- Les funcions pures són més fàcils d'entendre perquè no canvien cap estat i depenen només de l'entrada que se'ls dóna. Sigui quina sigui la sortida que produeixen, és el valor de retorn que donen. La seva signatura de funció proporciona tota la informació sobre ells, és a dir, el seu tipus de retorn i els seus arguments.
- La capacitat dels llenguatges de programació funcionals per tractar les funcions com a valors i passar-les a funcions com a paràmetres fa que el codi sigui més llegible i fàcilment comprensible.
- Provar i depurar és més fàcil. Com que les funcions pures només prenen arguments i produeixen sortida, no produeixen cap canvi, no prenen entrada ni produeixen alguna sortida oculta. Utilitzen valors immutables, de manera que es fa més fàcil comprovar alguns problemes en programes escrits que fan servir funcions pures.
- S'utilitza per implementar concurrència/paral·lelisme perquè les funcions pures no canvien les variables ni cap altra dada fora d'ella.
- Adopta una avaluació mandrosa que evita l'avaluació repetida perquè el valor s'avalua i s'emmagatzema només quan és necessari.
Desavantatges:
instància de en java
- De vegades, escriure funcions pures pot reduir la llegibilitat del codi.
- Escriure programes en estil recursiu en lloc d'utilitzar bucles pot ser una mica intimidatori.
- Escriure funcions pures és fàcil, però combinar-les amb la resta de l'aplicació i les operacions d'E/S és una tasca difícil.
- Els valors immutables i la recursivitat poden provocar una disminució del rendiment.
Aplicacions:
- S'utilitza en càlculs matemàtics.
- Es necessita quan es requereix concurrència o paral·lelisme.
Fet: Whatsapp només necessita 50 enginyers per als seus 900M usuaris perquè Erlang s'utilitza per implementar les seves necessitats de concurrència. Facebook utilitza Haskell en el seu sistema anti-spam.