Jakie jest twoje najmocniejsze zdanie na temat programowania funkcjonalnego? [Zamknięte]


25

Programowanie funkcjonalne jest jednym z najstarszych paradygmatów programowania. Jednak nie jest on powszechnie stosowany w branży w porównaniu do bardziej popularnych paradygmatów. Ale w dużej mierze zostało to podkreślone w środowisku akademickim.

Jakie jest twoje najmocniejsze zdanie na temat programowania funkcjonalnego?


5
LINQ? Delegaci .NET? DSL jak Mathematica?
Jon Harrop,

5
Nawiasem mówiąc, pojęcie „programowanie funkcjonalne” używane jest przez różne osoby w celu oznaczenia różnych rzeczy, dlatego musisz wyjaśnić, którego znaczenia używasz.
Jon Harrop,

2
Nigdy nie znajdziesz żadnych osób do kodowania na podstawie kodu funkcjonalnego. Niezbyt dobra decyzja biznesowa, ograniczająca pulę talentów.
Patrick Hughes,

Odpowiedzi:


52

Problem polega na tym, że najczęstszy kod nieodłącznie wiąże się z aplikacjami stanowymi - aplikacjami biznesowymi, grami, interfejsem użytkownika itp. Nie ma problemu z tym, że niektóre części aplikacji są całkowicie funkcjonalne; w rzeczywistości większość aplikacji może skorzystać na co najmniej jednym obszarze. Ale forsowanie paradygmatu w tym miejscu wydaje się sprzeczne z intuicją.


19
Absolutnie. Czyste programowanie funkcjonalne NIE jest odpowiednie dla aplikacji bardzo zorientowanych na stan. Właśnie dlatego lubię języki hybrydowe, które potrafią oba. Używaj paradygmatów funkcjonalnych dla problemów funkcjonalnych, paradygmatów imperatywnych dla problemów imperatywnych.
Matt Olenik,

8
Zgoda! Stan jest istotną częścią programowania. Dlatego nawet Haskell, pod pewnymi względami najczystszy z języków FP, pozwala na użycie stanu i IO - po prostu wprowadza rozróżnienie między kodem IO / zmiennym kodem stanu a czystym kodem, co jest bardzo miłe do testowania i dla łatwości zrozumienia .
Bill

8
Dlatego kocham Haskella. Zachęca do minimalizacji kodu stanowego. W OO staram się pisać kod wielokrotnego użytku, łatwy do zrozumienia i testowania. Przez większość czasu kończę na kodzie, nie pisałbym zbyt wiele w Haskell.
LennyProgrammers

4
„po prostu wprowadza rozróżnienie między kodem IO / zmiennym kodem stanu a czystym kodem, co jest bardzo przydatne do testowania”. Nie można nawet drukować komunikatów debugowania bez obchodzenia systemu typów lub wprowadzania monad creep.
Jon Harrop,

2
Przypuszczalnie czysty program funkcyjny pozostawiłby świat zupełnie niezmieniony, uruchamiając go?
Martin Beckett,

24

Problemem z programowaniem funkcjonalnym nie jest samo programowanie funkcjonalne - to większość ludzi, którzy to robią i (gorzej) większość osób, które projektują języki, w których to robi.

Problem wynika z faktu, że pomimo tego, że są bardzo bystrzy (czasem wręcz błyskotliwi), zbyt wielu ludzi jest po prostu zbyt fanatycznych w kwestii czystości, doskonałości i egzekwowania własnego (często raczej wąskiego) spojrzenia na świat i programowania na język i wszyscy, którzy go używają.

Jednym z rezultatów jest brak kompromisu. Prowadzi to (między innymi) do około 10 000 języków i dialektów, które są wystarczająco różne, aby drażnić, ale tylko dość rzadko różne, aby jeden miał naprawdę znaczącą przewagę nad innymi. Wiele osób patrzy również na rzeczywisty świat i decyduje, że ponieważ nie pasuje on zbyt dobrze do modelu funkcjonalnego, jest po prostu zły i najlepiej go zignorować.

Brak możliwości kompromisu doprowadził również do powstania kilku języków, które są absolutnie piękne dla określonego rodzaju problemu (lub kilku konkretnych rodzajów problemów), ale naprawdę są do kitu dla wielu innych. Niektóre z nich są prawdopodobnie spowodowane przez sam model funkcjonalny, ale wydaje się, że o wiele więcej (przynajmniej dla mnie) jest spowodowany przez podstawowy typ osobowości, który na początku przyciąga ten obszar.

To prowadzi do wielu problemów. Po pierwsze, nauka „programowania funkcjonalnego” ma przede wszystkim wartość filozoficzną. W przypadku większości innych rodzajów języków znajomość jednego języka danego gatunku stanowi znaczącą pomoc w nauce innego. Jeśli mój projekt używa języka XI, zwykle mogę zatrudnić kogoś, kto zna język Y (ale nie X) dość bezpiecznie. W przypadku języków funkcjonalnych jest to o wiele mniej prawdziwe. Być może znasz Erlanga całkiem dobrze, ale nadal uważasz, że monady Haskell są całkowicie obce i niezrozumiałe.

Połącz liczbę języków z ograniczoną możliwością przenoszenia między nimi talentów, a dostaniesz brzydką sytuację: prawie jeden język lub dialekt nie jest w stanie utworzyć „masy krytycznej” niezbędnej do tego, aby można go było dość ogólnie wykorzystać. To się powoli zmienia, ale to wciąż dużo jak Linux staje się dominującym pulpit OS - każdego roku, ludzie wymyślić przekonujące argumenty, że w końcu to będzie lat - i podobnie jak ludzie, którzy już przewidują, że każdy od dziesięcioleci znów się mylą. Nie oznacza to, że (jedno z nich) nigdy nie może się zdarzyć - po prostu ludzie, którzy patrzą na prognozy i myślą „nie, nie w tym roku” byli tymi, którzy mieli rację do tej pory.


4
Być może byłoby więcej krzyżowania między językami funkcjonalnymi, gdyby było więcej języków funkcjonalnych.
Barry Brown,

5
Nie możesz być „funkcjonalny” bez tej czystości. Po przekroczeniu linii cała koncepcja rozpada się i powstaje bałaganiarski, równoległy, standardowy język bez żadnych zalet.
Patrick Hughes,

7
Więc twoim pierwszym problemem jest to, że języki funkcjonalne nie są wystarczająco różne, aby mieć nad sobą przewagę, a twoim drugim problemem jest to, że są zbyt różne, aby łatwo się między nimi przełączać?
Tikhon Jelvis,

2
Dla mnie ta odpowiedź brzmi jak rant. Twój argument byłby znacznie bardziej przekonujący, gdybyś podał kilka przykładów.
Benjamin Hodgson

1
...roughly 10,000 languages and dialects that are enough different to annoy but only rarely enough different for one to have a truly significant advantage over the others...Nie, to brzmi jak wszystkie te procedury. Java, Scala, Kotlin, C ++, C #, Groovy, Cheddar, ES6, Ceylon, Python, lista jest długa - ciągłe nudne iteracje C, które nie rozwiązują prawdziwych problemów. To moja nieprzyzwoita opinia, aby uzupełnić tę nieprzyzwoitą odpowiedź: D
kot

17

Myślę, że powodem, dla którego programowanie funkcjonalne nie jest zbyt szeroko stosowane, jest to, że zbyt wiele mu przeszkadza. Trudno poważnie przyjrzeć się na przykład Lispowi lub Haskellowi, nie mówiąc „ten cały język jest jedną wielką inwersją abstrakcji”. Kiedy ustanawiasz abstrakty podstawowe, których koder nie może znaleźć poniżej, gdy jest to konieczne, ustalasz rzeczy, których język po prostu nie może zrobić, a im bardziej funkcjonalny jest język, tym więcej z nich ma.

Weźmy na przykład Haskella. W imię czystości funkcjonalnej musisz używać rewolucyjnej inwersji abstrakcji, której nikt nie rozumie, aby zarządzać stanem i I / O, dwiema najbardziej fundamentalnymi częściami każdego programu komputerowego, który oddziałuje na wszystko! To szybko się starzeje.


9
+1, chociaż czasami czuję to samo, gdy programuję w imperatywnych językach wysokiego poziomu. Na przykład, dlaczego fsck muszę utworzyć pojedynczą klasę metod, która implementuje interfejs jednej metody w Javie, zamiast używać wskaźnika funkcji tak jak w C?
dsimcha

14
Powiedziałbym, że nie chodzi o to, że „nie można dostać się pod” te abstrakcje, chodzi o to, że zajmuje to dużo pracy. Jesteśmy przyzwyczajeni do zbierania banana i jedzenia go w imperatywnym języku; Haskell (na przykład) sprawia, że ​​najpierw wypełniasz 20-stronicowy formularz, ponieważ priorytetem jest zagwarantowanie, że żaden banan nigdy nie zostanie w tajemniczy sposób zjedzony, gdy nie patrzysz. Co pomaga w rozważaniach na temat bananów, ale czasami jesteś po prostu głodny.
j_random_hacker

4
@dsimcha: jest to szczególna cecha Javy, a nie trend w imperatywnych językach wysokiego poziomu. W rzeczywistości języki wysokiego poziomu prawdopodobnie prawdopodobnie pełnią tę funkcję jako obiekt pierwszej klasy.
Muhammad Alkarouri

3
Konieczność stosowania monad w Haskell nie wynika z czystości funkcjonalnej, ale z faktu, że efekty uboczne i leniwa ocena to dwa świetne smaki, które NIE smakują świetnie razem. Monady wymuszają sekwencyjną ocenę. (Naprawdę, powinny się nazywać Konstruktorami Obliczeń lub czymś takim. „Monada” to kiepska nazwa dla kogokolwiek innego niż teoretyk kategorii.) I możesz z radością robić FP bez (świadomego używania) monad!
Frank Shearar,

4
Należy zwrócić uwagę na jedną rzecz: biorąc pod uwagę te „inwersje abstrakcji”, język może być bardziej ograniczony, ale kompilator i środowisko wykonawcze mają więcej gwarancji na Twój kod i mogą zrobić więcej. Jest to tak samo jak wyrzucanie elementów bezużytecznych - w języku gc nie można po prostu korzystać z przestrzeni malloc (co może być przydatne), ale w zamian środowisko wykonawcze może zarządzać całą pamięcią za Ciebie, potencjalnie bardziej efektywnie niż ręcznie. To samo z funkcjonalną czystością.
Tikhon Jelvis,

8

Z całym szacunkiem uważam, że twoje pytanie jest źle postawione. Programowanie funkcjonalne to narzędzie, a raczej zestaw narzędzi, które są przydatne do rozwiązywania określonych rodzajów problemów. Posiadanie opinii na ten temat ma sens tylko w kontekście konkretnego problemu lub aplikacji. Ogólnie rzecz biorąc, opinia jest jak opinia na temat szczypiec lub kluczy.


4
To logicznie uzasadniony punkt, ale można temu zaradzić, zaznaczając „dla tego rodzaju problemów programistycznych, które często napotykasz” w ostatnim zdaniu pytania PO. (Nie ma znaczenia, że ​​poszczególni czytelnicy napotykają różne problemy, pod warunkiem, że opisują, kim są.)
j_random_hacker

4

Nawet gdybym go opanował, może nie chciałbym używać funkcjonalnego języka dla produktu komercyjnego z tego prostego powodu, że nie są one szeroko rozumiane, a gdybym spodziewał się rozwoju firmy, byłbym zaniepokojony możliwością znalezienia innych programistów zdolnych utrzymywania lub przedłużania go w czasie.

Nie jest to nie do pomyślenia, a prawdopodobnie uzyskałbyś wyższy standard programisty, ponieważ javaschool bez prawdziwych umiejętności hakowania nie wiedziałby, od czego zacząć projekt tego typu, ale ograniczona pula zdolnych programistów z pewnością byłaby koniecznym rozważeniem z perspektywy biznesowej.


2

Czas na rynek

Trudno jest pozbyć się pełnego środowiska IT z kodu proceduralnego i mantr.


1
Programy funkcjonalne są często łatwiejsze do przetestowania. I są krótsi. Więc się nie zgadzam. Myślę, że odpowiadasz na inne pytanie „Jaka jest twoja najsilniejsza opinia przeciwko przejściu na programowanie funkcyjne?”.
Jonas


2

po pierwsze nie akceptuję żadnego argumentu dotyczącego stanowego programowania i fp. spójrz na monadę stanu w haskell, a znajdziesz wiele interesujących nowych sposobów oceny wpływu stanu na kod.

gdybym miał znaczący argument przeciwko fp, byłoby tak, że nauka poważnego funkcjonalnego języka, takiego jak haskell, jest jak nauka jazdy samochodem Formuły 1 ... radosna i edukacyjna, ale niestety bezużyteczna do codziennego kodowania przemysłowego, ponieważ średnio , twoi współpracownicy jeżdżą camrysami i cieszą się z tego. wciąż bardzo trudno jest znaleźć pracę w środowisku przyjaznym dla fp i nie widzę tego, chyba że ktoś chce rozpocząć własną działalność lub poszukać niektórych znanych praktykujących fp.

przypuszczam, że moja odpowiedź pokazuje mnie jako fana fan fp. proponuję dać poważny obrót prawdziwym językiem fp, takim jak haskell, zanim zaczniesz się martwić o znalezienie powodów, dla których nie powinieneś.


6
Myślę, że pierwszy akapit dokładnie opisuje, co jest nie tak z myśleniem o FP. Nie chcemy „ciekawych nowych sposobów oceny wpływu stanu na nasz kod”. Co to w ogóle znaczy?!? Chcemy tylko, aby państwo było tam i było łatwo dostępne, ponieważ potrzebujemy tego, aby faktycznie załatwić sprawę.
Mason Wheeler,

2
Camry, którym jeżdżę, ma swoje problemy, ale nie wymaga ode mnie ciągłego sprawdzania, czy nie ma wycieków przestrzeni pod maską . Haskell bardziej przypomina język, który wygląda jak samochód F1, ale w rzeczywistości nie może wykonywać wysokich obrotów przez dłuższy czas. :-P
j_random_hacker

1
@Mason Wheeler: „Nie chcemy nowych interesujących sposobów oceny wpływu stanu na nasz kod”. Zamiast tego wolimy spędzić tydzień na śledzeniu bardzo nieprzyjemnego błędu z powodu niepożądanego efektu ubocznego (mówię z własnego doświadczenia).
Giorgio

@brad clawsie: Myślę, że cały problem kontrolowania efektów ubocznych w FP może przyczynić się do zwiększenia produktywności kodowania: pisanie zajmuje więcej czasu, a naprawianie zajmuje mniej czasu. Niestety najpierw trzeba trochę wysiłku w nauce, a wielu programistów nie ma takiego długofalowego myślenia: wszystko musi być zrobione szybko. Nie ma czasu, aby zrobić to poprawnie za pierwszym razem, ale zawsze jest czas na debugowanie i naprawienie go później. :-)
Giorgio

@Mason Wheeler: Z funkcjonalnego punktu widzenia posiadanie stanu wspólnego jest przydatne tylko do celów optymalizacji: kopiowanie wartości zajmuje zbyt dużo czasu i pamięci, więc udostępniasz obiekt danych, aby uniknąć niepotrzebnego kopiowania. Jednak wymuszanie reguły stanu wspólnego od samego początku jest rodzajem przedwczesnej optymalizacji.
Giorgio

2

Jestem wielkim fanem i zwolennikiem programowania funkcjonalnego. Ale oto moje punkty:

  • łatwa do nauczenia
    Języki programowania, takie jak python i ruby ​​(i wiele innych języków) są łatwe do nauczenia. Zaawansowane programowanie funkcjonalne z takimi językami jak Haskell, Agda, Coq, ATS itp. Jest dość trudne do nauczenia się. Niektórzy używają terminu „programowanie strukturalne matematyczne”. Łatwo jest, jeśli znasz teorię kategorii i matematykę abstrakcyjną, ale całkiem sporo pracy, jeśli nie masz pojęcia, czym są na przykład „monady”.

  • programowanie w języku skryptowym może oznaczać większą wydajność.
    W niektórych sytuacjach użycie języków skryptowych, takich jak Python i Ruby, może zwiększyć wydajność. Oznacza to szybkie prototypowanie i klejenie różnych pakietów lub bibliotek. Nawet korzystanie z dynamicznych języków (np. Dynamiczne programowanie obiektowe) może być dobrym rozwiązaniem w tym kontekście. Zazwyczaj pisanie statyczne jest lepsze, ale skrypty z typami dynamicznymi mogą mieć pozytywny wpływ.

  • względy biznesowe
    Programowanie to tylko niewielka część udanych projektów oprogramowania. Oprogramowanie musi działać, użytkownicy muszą być zadowoleni i nie musi to zależeć od używanego języka programowania. Menedżerowie muszą myśleć o korzyściach i ryzyku podczas oceny nowych technologii i języków programowania. Czy nowi programiści mogą szybko nauczyć się nowego języka programowania? Czy w firmie jest doświadczenie z technologią? Czy istnieje ryzyko i czy będzie to trudne do sporu z wyższym kierownictwem?

W kontekście biznesowym programowania funkcjonalnego można używać w systemach, które dodają do podstawowych komponentów oprogramowania, np. Komponentów, które nie są tak ważne dla misji. Na przykład bank, który prawie nie zmieni podstawowego oprogramowania, ale doda nowe części (GUI, oprogramowanie monitorujące itp.) W nowym języku programowania. (Może są wyjątki, ale takie jest moje doświadczenie z bankami.)

Ponadto programowanie funkcjonalne jest bardzo przydatne, gdy formalna weryfikacja jest zaletą lub koniecznością.


3
„łatwa do nauczenia”: nie wydaje mi się, żeby opanowanie Haskell było trudniejsze niż opanowanie nowoczesnego C ++. Myślę, że często zastanawiamy się nad tym, czego nie znamy.
Giorgio

1

Nie jestem przeciwny FP jako przydatnemu paradygmatowi, ale jestem przeciwny temu jako jedynemu paradygmatowi dostępnemu w języku programowania.

Oferuje zalety w rozwiązywaniu wielu problemów. Jednak FP można i było stosowane w językach proceduralnych, takich jak C.


Zgadzam się z pierwszym zdaniem, nie zgadzam się z drugim. Zasadniczo nie możesz zrobić FP bez wyrzucania śmieci.
dsimcha

Nie ma wymogu, aby system wykonawczy języka nie miał przejrzystego zarządzania pamięcią (z odśmiecaniem) w celu dopasowania do etykiety „proceduralnej”, więc ironią jest, że w ten sposób sformułowałeś swoje drugie zdanie. BASIC jest jednym z takich języków.
Huperniketes

„Zasadniczo nie można zrobić FP bez wyrzucania elementów bezużytecznych”. - Czemu?
quant_dev 16.04.11

+1 Programowanie funkcjonalne na najbardziej podstawowym poziomie to programowanie bezstanowe. Nie sądzę, aby istniał jakiś język, który do pewnego stopnia nie mógłby tego zrobić. Pisałem funkcje w C, C ++, Java, asembler, C #, a nawet Basic. Wszystko, co jest wymagane, to aby funkcja nie miała skutków ubocznych ani nie zachowywała stanu między połączeniami.
Michael K,

Z drugiej strony, jeśli twój język jest całkowicie czysty, kompilator ma większą swobodę w optymalizacji. Ponadto kod staje się łatwiejszy do przetestowania i uzasadnienia. Będąc funkcjonalny całej nie dają pewne korzyści w porównaniu z podejściem hybrydowym; jeśli mimo wszystko większość kodu będzie bezstanowa, możesz pójść nieco dalej i skorzystać z dodatkowych korzyści.
Tikhon Jelvis

1
  1. (i zdecydowanie najważniejsze) Pracownicy programistów nie są szkoleni w tych językach lub stylach
  2. Wielu funkcjonalnych ewangelistów popadło w dziwki lub ciastka owocowe ze względu na sposób, w jaki próbują sprzedawać funkcjonalne. Nikt nie lubi dziury i nikt nie będzie wrzucał pieniędzy za ciasto owocowe. Pamiętaj, bardzo podoba mi się funkcjonalność i chciałbym ją wciągnąć, ale wiem, że w moim miejscu pracy byłbym jedyną osobą, która mogłaby ją rozwijać bez wydawania pieniędzy na szkolenia (ciężka sprzedaż) i prawie wszystkie dobre referencje omawiają czytelnika.

Funkcjonalność pojawi się, gdy będziemy mieli setki rdzeni i dojdziemy do wniosku, że zamki nie skalują się. Wówczas zagnieżdżone dane równoległe będą jedyną drogą dla programów „dużych żelaznych”, a funkcjonalność je wyróżnia.


0

FP jest fajna w środowisku akademickim, ponieważ fajnie jest pisać fajne krótkie programy, ignorując wydajność. W prawdziwym świecie nie ma żadnego spisku przeciwko niemu. Także na przykład implementacja niektórych rzeczy (na przykład sortowanie radix) wydaje się być całkowitym bólem w FP. Aha i wygenerowany kod to IMHExperience sloooooooooooooooooooow.


4
Tak, to po prostu nieprawda. Kod Haskell jest zwykle na równi z C i Javą i znacznie szybciej niż Python i przyjaciele. Równoległe jest zwykle trywialne, potencjalnie dając jeszcze większą prędkość.
Tikhon Jelvis,

0

Niektóre mają dość stromą krzywą uczenia się, co zajmuje dużo czasu (zwłaszcza jeśli pochodzisz z OOP; kilka razy pochylisz głowę przed uzyskaniem zmiany paradygmatu).

Mimo że zacząłem programować funkcjonalnie (z Javy i na Clojure), nadal uważam to za dość trudne. Społeczność nie wydaje się pisać tak ekspresyjnego kodu jak Java.

Wydaje się, że występuje niewielka utrata ekspresji i niewielki wzrost złożoności.


Myślę, że ludzie bez wcześniejszego doświadczenia w programowaniu powiedzieliby, że OOP ma bardziej krzywą uczenia się niż FP, ponieważ FP jest bliżej matematyki. Nie rozumiem, co masz na myśli mówiąc „Społeczność wydaje się nie pisać tak ekspresyjnego kodu jak Java”, o co ci chodzi?
Jonas

Nigdy nie słyszałem o tym, że język funkcjonalny traci ekspresję. Ale nigdy też nie użyłem języka mniej ekspresyjnego niż Java, więc mogę mieć inną definicję „ekspresji”.
glenatron

@Jonas - z jednej prostej rzeczy: nazwy skrótów dla funkcji, zmiennych itp. Mam na myśli, dlaczego nie nazwać rzeczy takimi, jakimi mają się zajmować? dlaczego „pmap”?
Belun,

1
@Belun: To nie ma nic wspólnego z programowaniem funkcjonalnym. Musisz odwoływać się do określonego języka programowania. Mapa jest funkcją powszechną w wielu funkcjonalnych językach programowania i ma dobrą nazwę . pmapmoże się to odnosić do wariantu równoległego.
Jonas

powiedziałem „społeczność nie wydaje się pisać”. oznacza to, że doświadczyłem tego i odnosi się do społeczności, którą oglądałem. nie musi to dotyczyć wszystkich, choć w to wątpię. ma to związek z programowaniem funkcjonalnym, jest jak w swoim stylu
Belun,

0

Chociaż mam niewielkie doświadczenie z funkcjonalnymi językami programowania (znam niektóre Haskell i Lisp), uważam, że paradygmat FP jest bardzo potężny i często bardziej elegancki niż inne paradygmaty. Chciałbym mieć możliwość pracy nad poważnym projektem z wykorzystaniem FP.

Jedynym obszarem, w którym mam poważne wątpliwości co do skuteczności PR, jest sposób radzenia sobie ze złożonymi strukturami danych, których nie można zdefiniować indukcyjnie, np. Wykresy. Na przykład, jeśli muszę zaimplementować algorytm, który działa na dużym wykresie, być może przechodząc przez wykres i wprowadzając niewielkie zmiany lokalne, zastanawiam się, czy podejście FP może pasować do trybu imperatywnego, w którym program może przenosić się z węzła do węzeł za pomocą wskaźników.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.