logo

Paradygmat programowania funkcjonalnego

Wstęp
Programowanie funkcjonalne to paradygmat programowania, w którym staramy się powiązać wszystko w stylu czystych funkcji matematycznych. Jest to deklaratywny typ stylu programowania. Koncentruje się głównie na tym, co należy rozwiązać, w przeciwieństwie do stylu imperatywnego, w którym główny nacisk kładziony jest na to, jak rozwiązać. Używa wyrażeń zamiast instrukcji. Wyrażenie jest oceniane w celu wygenerowania wartości, podczas gdy instrukcja jest wykonywana w celu przypisania zmiennych. Funkcje te mają pewne cechy specjalne omówione poniżej.

Programowanie funkcyjne opiera się na rachunku lambda:
Rachunek lambda to platforma opracowana przez Alonzo Churcha do badania obliczeń za pomocą funkcji. Można go nazwać najmniejszym językiem programowania na świecie. Podaje definicję tego, co jest obliczalne. Wszystko, co można obliczyć za pomocą rachunku lambda, jest obliczalne. Pod względem zdolności obliczeniowych jest odpowiednikiem maszyny Turinga. Zapewnia ramy teoretyczne do opisu funkcji i ich oceny. Stanowi podstawę prawie wszystkich obecnych języków programowania funkcjonalnego.
Fakt: Alan Turing był uczniem Alonzo Churcha, który stworzył maszynę Turinga, która położyła podwaliny pod imperatywny styl programowania.



Języki programowania obsługujące programowanie funkcjonalne: Haskell, JavaScript, Python, Scala, Erlang, Lisp, ML, Clojure, OCaml, Common Lisp, Racket.

narodowość Pete'a Davidsona

Koncepcje programowania funkcjonalnego:

  • Czyste funkcje
  • Rekurencja
  • Przezroczystość referencyjna Funkcje są pierwszej klasy i mogą być zmiennymi wyższego rzędu. Zmienne są niezmienne

Czyste funkcje: Funkcje te mają dwie główne właściwości. Po pierwsze, zawsze dają ten sam wynik dla tych samych argumentów, niezależnie od czegokolwiek innego.
Po drugie, nie mają skutków ubocznych, tj. nie modyfikują żadnych argumentów, zmiennych lokalnych/globalnych ani strumieni wejścia/wyjścia.
Późniejsza właściwość nazywa się niezmiennością. Jedynym wynikiem czystej funkcji jest wartość, którą zwraca. Są deterministyczne.
Programy wykonane przy użyciu programowania funkcyjnego są łatwe do debugowania, ponieważ czyste funkcje nie mają skutków ubocznych ani ukrytych wejść/wyjść. Funkcje czyste ułatwiają także pisanie aplikacji równoległych/współbieżnych. Kiedy kod jest napisany w tym stylu, inteligentny kompilator może zrobić wiele rzeczy — może zrównoleglić instrukcje, poczekać z oceną wyników, gdy ich potrzebują, i zapamiętać wyniki, ponieważ wyniki nigdy się nie zmieniają, dopóki nie zmienią się dane wejściowe.
przykład czystej funkcji:



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>

Rekurencja: W językach funkcjonalnych nie ma pętli for ani while. Iteracja w językach funkcjonalnych jest realizowana poprzez rekurencję. Funkcje rekurencyjne wielokrotnie wywołują same siebie, aż do osiągnięcia przypadku podstawowego.
przykład funkcji rekurencyjnej:

fib(n) if (n <= 1) return 1; else return fib(n - 1) + fib(n - 2);>

Przejrzystość referencyjna: W programach funkcjonalnych zmienne raz zdefiniowane nie zmieniają swojej wartości w trakcie trwania programu. Programy funkcjonalne nie posiadają instrukcji przypisania. Jeśli musimy przechowywać jakąś wartość, zamiast tego definiujemy nowe zmienne. Eliminuje to ryzyko wystąpienia skutków ubocznych, ponieważ dowolną zmienną można zastąpić jej rzeczywistą wartością w dowolnym momencie wykonania. Stan dowolnej zmiennej jest stały w dowolnym momencie.

pobierz film z YouTube vlc

Przykład:



x = x + 1 // this changes the value assigned to the variable x. // So the expression is not referentially transparent.>

Funkcje są pierwszorzędne i mogą być wyższego rzędu: Funkcje pierwszej klasy są traktowane jako zmienna pierwszej klasy. Zmienne pierwszej klasy mogą być przekazywane do funkcji jako parametry, mogą być zwracane z funkcji lub przechowywane w strukturach danych. Funkcje wyższego rzędu to funkcje, które przyjmują inne funkcje jako argumenty i mogą również zwracać funkcje.

funkcja pythona chr

Przykład:

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>

Zmienne są niezmienne: W programowaniu funkcjonalnym nie możemy modyfikować zmiennej po jej zainicjowaniu. Możemy tworzyć nowe zmienne – ale nie możemy modyfikować istniejących zmiennych, a to naprawdę pomaga w utrzymaniu stanu przez cały czas wykonywania programu. Gdy utworzymy zmienną i ustawimy jej wartość, możemy mieć całkowitą pewność, wiedząc, że wartość tej zmiennej nigdy się nie zmieni.

Zalety i wady programowania funkcjonalnego

Zalety:

  1. Funkcje czyste są łatwiejsze do zrozumienia, ponieważ nie zmieniają żadnych stanów i zależą jedynie od danych wejściowych. Niezależnie od tego, jaki wynik wyprodukują, jest to wartość zwracana, którą dają. Sygnatura ich funkcji zawiera wszystkie informacje na ich temat, tj. typ zwracany i argumenty.
  2. Zdolność funkcjonalnych języków programowania do traktowania funkcji jako wartości i przekazywania ich do funkcji jako parametrów sprawia, że ​​kod jest bardziej czytelny i łatwiejszy do zrozumienia.
  3. Testowanie i debugowanie jest łatwiejsze. Ponieważ czyste funkcje pobierają tylko argumenty i generują dane wyjściowe, nie powodują żadnych zmian, nie pobierają danych wejściowych ani nie generują ukrytych wyników. Używają niezmiennych wartości, dzięki czemu łatwiej jest sprawdzić niektóre problemy w programach napisanych przy użyciu czystych funkcji.
  4. Służy do implementacji współbieżności/równoległości, ponieważ czyste funkcje nie zmieniają zmiennych ani żadnych innych danych poza nimi.
  5. Przyjmuje leniwą ocenę, która pozwala uniknąć ponownej oceny, ponieważ wartość jest oceniana i przechowywana tylko wtedy, gdy jest potrzebna.

Niedogodności:

  1. Czasami pisanie czystych funkcji może zmniejszyć czytelność kodu.
  2. Pisanie programów w stylu rekurencyjnym zamiast używania pętli może być nieco onieśmielające.
  3. Pisanie czystych funkcji jest łatwe, ale łączenie ich z resztą aplikacji i operacjami we/wy jest trudnym zadaniem.
  4. Niezmienne wartości i rekurencja mogą prowadzić do spadku wydajności.

Aplikacje:

  • Jest używany w obliczeniach matematycznych.
  • Jest potrzebny tam, gdzie wymagana jest współbieżność lub równoległość.

Fakt: Whatsapp potrzebuje tylko 50 inżynierów do swoich 900M użytkownicy ponieważ Erlang jest używany do realizacji potrzeb w zakresie współbieżności. Facebook wykorzystuje Haskell w swoim systemie antyspamowym.

podciąg w bashu