Jakie są zalety programowania funkcjonalnego? [Zamknięte]

97

Jak myślisz, jakie są zalety programowania funkcjonalnego? A jak dziś odnoszą się do programistów?

Jakie są największe różnice między programowaniem funkcjonalnym a OOP?

Rayne
źródło
5
Paradoks Blub. paulgraham.com/avg.html
missingfaktor

Odpowiedzi:

75

Styl programowania funkcjonalnego polega na opisaniu tego, czego chcesz, a nie na tym, jak to osiągnąć. tj .: zamiast tworzyć pętlę for ze zmienną iteratora i przechodzić przez tablicę, wykonując coś dla każdej komórki, można powiedzieć, że odpowiednik „ta etykieta odnosi się do wersji tej tablicy, w której ta funkcja została wykonana na wszystkich elementy."

Programowanie funkcjonalne przenosi do kompilatora więcej podstawowych pomysłów programistycznych, takich jak rozumienie list i buforowanie.

Największą zaletą programowania funkcjonalnego jest zwięzłość, ponieważ kod może być bardziej zwięzły. Program funkcjonalny nie tworzy zmiennej iteratora, która byłaby środkiem pętli, więc ten i inne rodzaje narzutu są eliminowane z kodu.

Inną ważną korzyścią jest współbieżność, która jest łatwiejsza do wykonania przy programowaniu funkcjonalnym, ponieważ kompilator zajmuje się większością operacji, które wymagały ręcznego ustawiania zmiennych stanu (jak iterator w pętli).

Pewne korzyści z wydajności można również dostrzec w kontekście pojedynczego procesora, w zależności od sposobu pisania programu, ponieważ większość języków funkcjonalnych i rozszerzeń obsługuje leniwą ocenę. W Haskell można powiedzieć „ta etykieta reprezentuje tablicę zawierającą wszystkie liczby parzyste”. Taka tablica jest nieskończenie duża, ale możesz poprosić o 100-tysięczny element tej tablicy w dowolnym momencie, bez konieczności wiedzieć - w czasie inicjalizacji tablicy - jakiej największej wartości będziesz potrzebować. Wartość zostanie obliczona tylko wtedy, gdy będzie to potrzebne i nie będzie dalej.

Chris Wenham
źródło
13
Wydaje mi się, że twój pierwszy akapit jest bliżej opisania deklaratywnego programowania relacyjnego, takiego jak Prolog, niż programowania funkcjonalnego.
McPherrinM
6
@McPherrinM: języki funkcyjne są deklaratywne, a nie imperatywne.
Lie Ryan,
2
Wygląda na to, że mylisz DP kontra IP z procedurami i FP . FP zapewnia separację obaw, kładąc nacisk na kompozycję funkcji, tj. Oddzielając zależności między podobliczeniami deterministycznego obliczenia.
Shelby Moore III
2
@LieRyan nieprawidłowy. Proszę zobaczyć link w moim wcześniejszym komentarzu
Shelby Moore III,
Współbieżność to posiadanie wielu wątków, które mogą ze sobą współdziałać, co jest konieczne. Wykonywanie wielu niezależnych obliczeń w tym samym czasie nazywa się równoległością . Zobacz en.wikipedia.org/wiki/Concurrency_(computer_science)
Lambda Fairy
29

Największą korzyścią jest to, że nie jest to coś, do czego jesteś przyzwyczajony. Wybierz język taki jak Scheme i naucz się rozwiązywać z nim problemy, a staniesz się lepszym programistą w językach, które już znasz. To jak nauka drugiego ludzkiego języka. Zakładasz, że inni są w zasadzie odmianą samą w sobie, ponieważ nie masz z czym tego porównać. Kontaktowanie się z innymi, szczególnie tymi, które nie są związane z tym, co już wiesz, jest pouczające.

Kirk Strauser
źródło
28
to jest korzyść z uczenia się tego, a nie korzyść z samego paradygmatu
Moe
2
Ale czy naprawdę są oddzielne? Z punktu widzenia pierwotnego pytającego powiedziałbym, że nie - najprawdopodobniej szukają oni korzyści w sumie poświęcenia wysiłku na naukę języka funkcjonalnego.
Kendall Helmstetter Gelner
3
„to jest korzyść z uczenia się tego, a nie korzyść z samego paradygmatu”. Paradygmat przeniknie do innych prac OOP i może pomóc w uproszczeniu tam rozwoju. Możesz podejść do problemów zaczynając od „oblicz to wyjście z tego wejścia” i „skomponuj te dwie funkcje, które obliczają nowe dane” zamiast „czekaj - jaki był stan pewnej wspólnej zmiennej tam?” i „czy te procedury zostały wykonane we właściwej kolejności?”. Poważnie, zyskujesz te korzyści (dzięki zrozumieniu paradygmatu FP) w Pythonie, C #, C ++, Javie, możesz to nazwać.
Jared Updike
11

Dlaczego programowanie funkcjonalne ma znaczenie
http://www.cs.kent.ac.uk/people/staff/dat/miranda/whyfp90.pdf

Abstrakcyjny

Ponieważ oprogramowanie staje się coraz bardziej złożone, coraz ważniejsza jest jego dobra struktura. Dobrze skonstruowane oprogramowanie jest łatwe do napisania i debugowania oraz zawiera zbiór modułów, które można ponownie wykorzystać w celu zmniejszenia przyszłych kosztów programowania.

W tym artykule pokazujemy, że szczególnie dwie cechy języków funkcjonalnych, funkcje wyższego rzędu i leniwa ocena, mogą znacząco przyczynić się do modularności. Przykładowo, manipulujemy listami i drzewami, programujemy kilka algorytmów numerycznych i wdrażamy heurystykę alfa-beta (algorytm sztucznej inteligencji używany w programach do gier). Dochodzimy do wniosku, że skoro modułowość jest kluczem do pomyślnego programowania, programowanie funkcjonalne oferuje ważne korzyści dla rozwoju oprogramowania.

Robert Harvey
źródło
10

Dlatego dobrym punktem wyjścia byłaby próba zrozumienia pewnych rzeczy, które nie są możliwe w językach imperatywnych, ale możliwe w językach funkcjonalnych.

Jeśli mówisz o obliczalności, nie ma oczywiście nic, co jest możliwe w programowaniu funkcjonalnym, ale nie imperatywnym (lub odwrotnie).

Celem różnych paradygmatów programowania nie jest umożliwienie rzeczy, które wcześniej nie były możliwe, ale ułatwienie rzeczy, które wcześniej były trudne.

Programowanie funkcjonalne ma na celu ułatwienie pisania programów, które są zwięzłe, wolne od błędów i równoległe.

sepp2k
źródło
5

Nie musi to być jedno lub drugie: używanie języka takiego jak C # 3.0 pozwala łączyć najlepsze elementy każdego z nich. OO może być stosowany do struktury na dużą skalę na poziomie klasy i powyżej, Styl funkcjonalny dla struktury o małej skali na poziomie metody.

Używanie stylu funkcjonalnego pozwala na pisanie kodu, który jasno deklaruje jego zamiar, bez pomieszania go z instrukcjami przepływu sterowania itp. Ze względu na zasady, takie jak programowanie wolne od efektów ubocznych, znacznie łatwiej jest wnioskować o kodzie i sprawdzić jego poprawność .

Samuel Jack
źródło
5

Myślę, że najbardziej praktycznym przykładem potrzeby programowania funkcjonalnego jest współbieżność - programy funkcjonalne są w naturalny sposób bezpieczne dla wątków, a biorąc pod uwagę rozwój wielordzeniowego sprzętu, ma to ogromne znaczenie.

Programowanie funkcjonalne zwiększa również modułowość - często można zobaczyć metody / funkcje w trybie imperatywnym, które są o wiele za długie - prawie nigdy nie zobaczysz funkcji dłuższej niż kilka linii. A ponieważ wszystko jest oddzielone - możliwość ponownego użycia jest znacznie lepsza, a testowanie jednostkowe jest bardzo łatwe.

Bozhidar Batsov
źródło
3

Gdy program się rozrasta, liczba poleceń w naszym słowniku staje się zbyt duża, co bardzo utrudnia korzystanie z niego. To tutaj programowanie obiektowe ułatwia nam życie, ponieważ pozwala nam lepiej organizować nasze polecenia. Możemy powiązać wszystkie polecenia, które dotyczą klienta, z jakąś jednostką klienta (klasą), co czyni opis o wiele bardziej przejrzystym. Jednak program nadal jest sekwencją poleceń określających, jak ma postępować.

Programowanie funkcyjne zapewnia zupełnie inny sposób poszerzania słownictwa. Nie ogranicza się do dodawania nowych prymitywnych poleceń; możemy również dodać nowe struktury kontrolne - prymitywy, które określają, w jaki sposób możemy łączyć polecenia w celu utworzenia programu. W językach imperatywnych mogliśmy komponować polecenia w sekwencji lub używając ograniczonej liczby wbudowanych konstrukcji, takich jak pętle, ale jeśli spojrzysz na typowe programy, nadal zobaczysz wiele powtarzających się struktur; typowe sposoby łączenia poleceń

Soner Gönül
źródło
1

Nie myśl o programowaniu funkcyjnym w kategoriach „potrzeby”. Zamiast tego potraktuj to jako kolejną technikę programowania, która otworzy twój umysł, tak jak OOP, szablony, język asemblera itp. Mogły całkowicie zmienić twój sposób myślenia, kiedy (jeśli) się ich nauczyłeś. Ostatecznie nauka programowania funkcjonalnego uczyni cię lepszym programistą.

Justin Ethier
źródło
0

Jeśli nie znasz jeszcze programowania funkcjonalnego, nauka tego daje więcej sposobów rozwiązywania problemów.

FP to proste uogólnienie, które promuje funkcje do wartości pierwszej klasy, podczas gdy OOP służy do strukturyzowania kodu na dużą skalę. Istnieje jednak pewne nakładanie się, gdzie wzorce projektowe OOP mogą być reprezentowane bezpośrednio i znacznie bardziej zwięźle przy użyciu funkcji pierwszej klasy.

Wiele języków udostępnia zarówno FP, jak i OOP, w tym OCaml, C # 3.0 i F #.

Pozdrawiam, Jon Harrop.

JD
źródło