Plik programowanie funkcjonalne odpowiada wzorcowi programowania opartemu na koncepcji określania procedury programu jako matematycznego modelu funkcjonalnego, a nie jako jawnych sekwencji instrukcji dla procesora, co jest główną koncepcją w programowaniu imperatywnym.
Język funkcjonalny kładzie nacisk na instrukcje i terminy zamiast wykonywania instrukcji. W tym programowaniu wynik będzie zależał tylko od parametrów przekazanych do funkcji, w przeciwieństwie do innych typów, które są zgodne ze stanem lokalnym lub globalnym.
Jego nazwa pochodzi od funkcji matematycznych, które polegają na przypisaniu zbioru wejść do zbioru wyjść. Funkcja matematyczna tak naprawdę nie wykonuje żadnej pracy, ale opisuje model procesu, wyjaśniając za pomocą wzoru, co zbiór danych wejściowych wytwarza w funkcji.
Indeks artykułów
Podstawą, na której oparto programowanie funkcjonalne, był rachunek lambda, który został opracowany w trzeciej dekadzie XX wieku w celu definiowania i stosowania funkcji. LISP był pierwszym tego typu językiem programowania, zaprojektowanym w 1960 roku.
Chociaż większość języków programowania składa się z danych wejściowych, wyjściowych i zmiennych zewnętrznych, które można ustawiać lub używać z poziomu funkcji, programowanie funkcyjne pozwala tego uniknąć. Chodzi o to, że za każdym razem, gdy wywoływana jest funkcja z tymi samymi parametrami, powinna zwracać tę samą wartość.
Funkcjonalne języki programowania nazywane są aplikacjami, ponieważ funkcje są stosowane do ich parametrów, a także deklaratywne i nieproceduralne, ponieważ definicje określają, co ma być obliczane, a nie jak jest obliczane.
Funkcja jest czysta, gdy nie ma żadnych obserwowalnych skutków ubocznych, takich jak zmiana zmiennych zewnętrznych, zmiany w systemie plików itp..
Te funkcje są uważane za przekonujące, ponieważ nie zmienią bezpośrednio żadnych zmiennych, od których w pewnym momencie mogą zależeć inne części kodu. Kodowanie z tymi ograniczeniami wydawałoby się niewygodne, ale te funkcje należy uznać za deterministyczne, przewidywalne i dające się komponować..
Funkcje są traktowane jako wartości, które można przypisać do zmiennych, dzięki czemu można je przekazywać i zwracać z innych funkcji. Oznacza to, że funkcja może być używana tak, jakby była parametrem lub jako zwracana wartość.
Oznacza to, że funkcja może być przekazana jako taka, a nie tylko jako wynik funkcji. Na przykład rozważmy funkcję double (x), która zwraca dwukrotność wartości swojego parametru wejściowego. Zatem double (2) zwróci 4.
Ponieważ jest to funkcja pierwszej klasy, kod (double (double (2))) byłby taki sam jak kod double (4). Pozwala to na zagnieżdżenie jednej funkcji jako parametru innej i tak dalej.
Odnosi się do faktu, że w tym wzorcu programowania nie ma instrukcji przypisania. Oznacza to, że jeśli chcesz przechowywać dodatkowe wartości, musisz zdefiniować nowe zmienne. Dlatego stan zmiennej jest zawsze stały.
Eliminuje to najmniejszą możliwość wystąpienia niepożądanych efektów, ponieważ dowolną zmienną można zastąpić jej rzeczywistą wartością w dowolnym momencie wykonywania programu..
W programowaniu funkcjonalnym nie ma pętli „for” i „while”. Zamiast tego iteracja opiera się na rekurencji. Rekurencja jest implementowana przy użyciu funkcji rekurencyjnych, które wywołują siebie wielokrotnie, aż do osiągnięcia przypadku podstawowego.
Zmienne są niezmienne, to znaczy nie można modyfikować zmiennej po jej zainicjowaniu. Chociaż można utworzyć nową zmienną, modyfikowanie istniejących zmiennych jest niedozwolone.
Na przykładzie możesz przeanalizować różnicę między tymi podejściami, wykonując tę samą operację w obu układach, która polega na filtrowaniu liczb nieparzystych z listy, zastępując 5 liczbami parzystymi mniejszymi niż 5.
To te same obliczenia, z tym samym wynikiem. Jednak, jak widać, kod imperatywny jest rozwlekły i nie jest od razu zrozumiały. Z drugiej strony podejście deklaratywne jest czytelne i jednoznaczne, ponieważ koncentruje się na tym, co chcesz uzyskać.
To, co definiuje się jako czyste i nieczyste funkcje, można wyjaśnić za pomocą kilku podstawowych przykładów:
Oznacza to używanie funkcji w taki sam sposób, w jaki używane są dane. Dlatego mogą być przekazywane jako parametry do innej funkcji. W poniższym przykładzie funkcję int można przekazać jako parametr do funkcji map:
>>> lista (mapa (int, ["1", "2", "3"]))
[1, 2, 3]
Można je przypisywać do zmiennych i zwracać. Na przykład w poniższym kodzie możesz przypisać funkcję hello_world, a następnie wykonać zmienną jako funkcję.
- Skoncentruj się na tym, co chcesz osiągnąć (deklaratywne), a nie na tym, jak to osiągnąć (imperatyw).
- Nie zawierają instrukcji przypisania, więc po nadaniu wartości zmiennym nie będą się one już zmieniać. Dlatego programy funkcjonalne nie zawierają skutków ubocznych.
- Przepływ logiczny jest przejrzysty, ponieważ stan jest mniej rozproszony i nie jest domyślnie modyfikowany.
- Obsługuje koncepcję leniwej oceny, co oznacza, że wartość jest oceniana i przechowywana tylko w razie potrzeby.
- Ponieważ czyste funkcje nie zmieniają żadnego stanu i są całkowicie zależne od danych wejściowych, są łatwe do zrozumienia. Wartość zwracana przez takie funkcje jest taka sama, jak wynik przez nie generowany.
- Ze względu na naturę czystych funkcji, aby uniknąć zmiany zmiennych lub jakiejkolwiek zewnętrznej zmiany danych, implementacja współbieżności jest skuteczna.
- Funkcje są traktowane jako wartości, przekazywane do innych funkcji jako parametry. Poprawia to zrozumienie i czytelność kodu..
- Czyste funkcje przyjmują parametry raz, tworząc niezmienne dane wyjściowe. Używanie niezmiennych wartości ułatwia debugowanie i testowanie.
Są krótsze i łatwiejsze do zrozumienia niż imperatywy. Badania wykazały, że średnia produktywność programisty pod względem linii kodu jest mniej więcej taka sama dla każdego języka programowania, co przekłada się na wyższą produktywność.
Wywołanie funkcji nie może mieć innego skutku niż obliczenie jej wyniku. Wyklucza to ważne źródło błędów, a także sprawia, że kolejność wykonywania jest nieistotna, ponieważ żaden efekt wtórny nie będzie w stanie zmienić wartości wyrażenia i można go ocenić w dowolnym momencie.
Programista jest zwolniony z ciężaru ustanawiania przepływu kontroli. Ponieważ wyrażenia można ocenić w dowolnym momencie, zmienne można zastąpić ich wartościami.
Ta autonomia sprzyja temu, że programy funkcjonalne są łatwiejsze do zarządzania matematycznie niż programy konwencjonalne..
- Paradygmat programowania funkcjonalnego nie jest prosty, co utrudnia zrozumienie początkującym.
- Jest trudny w utrzymaniu, ponieważ wiele obiektów ewoluuje podczas kodowania.
- W niektórych przypadkach pisanie czystych funkcji powoduje zmniejszenie czytelności kodu.
- Niezmienne wartości w połączeniu z rekurencją mogą prowadzić do drastycznego zmniejszenia wydajności systemu.
- Ponowne użycie jest bardzo skomplikowane i wymaga ciągłego refaktoryzacji.
- Pisanie programów w stylu rekurencyjnym zamiast używania pętli lub pętli może być bardzo zniechęcającym zadaniem..
- Obiekty mogą nie przedstawiać poprawnie problemu.
- Chociaż pisanie czystych funkcji okazuje się łatwe, połączenie ich z resztą aplikacji i operacjami wejścia / wyjścia jest dość trudne
Programowanie sztucznej inteligencji odbywa się w funkcjonalnych językach programowania, a techniki sztucznej inteligencji migrują do aplikacji w świecie rzeczywistym.
Doskonale sprawdza się również w realizacji złożonych modeli matematycznych. Z tego powodu jednym z głównych zastosowań języków funkcjonalnych było tradycyjnie akademickie. Jest to przydatne do opracowywania specyfikacji wykonywalnych i implementacji prototypów.
Wiele języków funkcjonalnych wyróżnia się również we wdrażaniu przetwarzania równoległego. Wynika to z jego zdolności do korzystania z czystych funkcji, które zawsze zwracają tę samą wartość, niezależnie od kolejności, w jakiej są wykonywane..
WhatsApp korzysta z języka programowania Erlang, który jest zgodny z funkcjonalnym modelem programowania, umożliwiając w ten sposób ponad stu pracownikom obsługę danych należących do około 1,6 miliarda ludzi.
Innym ważnym nośnikiem stylu programowania funkcjonalnego jest Haskell. Jest używany przez Facebooka w jego systemie antyspamowym. Nawet JavaScript, jeden z najczęściej używanych języków programowania, obnosi się z właściwościami języka funkcjonalnego typu dynamicznego.
Został zaprojektowany po C ++, uzyskując wszystkie jego zalety, jednocześnie eliminując obserwowane słabości związane z koniecznością zgodności z C.
Jest wysoce skalowalny i współbieżny, dzięki czemu idealnie nadaje się do telekomunikacji i innych aplikacji, które otrzymują ogromne ilości danych w nieprzewidywalnej kolejności..
Jest to czysty funkcjonalny język programowania, który wykorzystuje rachunek Lambda.
Znajduje zastosowanie w zastosowaniach matematycznych, naukowych, finansowych, analitycznych i innych. Jedną z jego mocnych stron jest tworzenie oprogramowania do obsługi innych programów.
Jest to język open source oparty na języku Caml. Ma tendencję do tworzenia bardzo lekkich programów, pomagając im ładować się i działać szybciej niż te utworzone w innych językach.
Opiera się na składni LISP i strukturze ALGOL. Ze względu na swoją prostotę jest używany na wielu kursach informatycznych jako wprowadzenie do projektowania programów, aby pokazać niektóre podstawy programowania komputerowego.
Jeszcze bez komentarzy