Wątek przeniesiony 2021-04-03 15:26 z Algorytmy i struktury danych przez somekind.

Programowanie funkcyjne - dywagacje początkującego.

6

Trafiając w sieci na m.in.na filmy kolegi @jarekr000000 zainteresowałem się programowaniem funkcyjnym.
Po obejrzeniu zapoznaniu się z "elementarzem" t.j. wiki, kilku poradników i obejrzeniu kilu wykładów zauważyłem, że sama koncepcja nie jest mi obca i przez lata eksperymentowania z programowaniem zupełnie nieświadomie tego typu konstrukcje gdzieś w kodzie się pojawiały. Nie były one oczywiście sformalizowane i głęboko przeplatały się z programowaniem obiektowym, strukturalnym czy proceduralnym no ale nie da się ukryć, że było to właśnie to.
Dziś widzę, że popularność tego paradygmatu znacząco wzrasta ale mam także poważne obawy co do jej praktycznego stosowania. Teoria poparta prostymi przykładami na wykładach wygląda zawsze fajnie ale co z praktyką?
Teraz dygresja... Zanim nauczyłem się programować obiektowo przechodziłem przez programowanie klasyczne w BASIC i z wykorzystaniem kluczowej instrukcji GO TO, później w Pascalu nauczyłem się programować proceduralnie i strukturalnie gdzieś na początku studiów doszło programowanie obiektowe. Dziś mając dość spore doświadczenie w tych wszystkich sposobach programowania zaczynam poznawać kolejne zwane "funkcyjnym". Patrząc wstecz, przechodząc między kolejnymi metodami dostawałem nowe narzędzia pozwalające na łatwe poruszanie się w abstrakcjach coraz wyższego poziomu i to oczywiście jest dobre. Z drugiej zaś strony przegięcie z chęcią bycia "skrajnie formalnym" często nie miało praktycznego uzasadnienia i czasem łatwiej było napisać obiekt, który w środku był małym programem strukturalnym z "nie świrując" w kierunku usilnego pisania klas do obsługi plików, bazy danych, I/O itp...
Dziś niemal wszystkie moje większe programy są różnych form programowania jednak z naciskiem na obiektowość. Nie boję się jednak robić wyjątków gdy jest to faktyczne uzasadnione ułatwienie.

No i teraz pytania dotyczące praktyki:

  1. Gdzie znaleźć przykłady "większych" programów napisanych z zastosowaniem tego paradygmatu? Proste przykłady są piękne ale chciałbym zobaczyć starcie tego typu programowania np. z bazą danych, plikami, HTTP.

  2. Jak głęboko zakorzeniać funkcyjność w swoim programie? Na jakim poziomie warto to stosować? Czy jedynie jako odgórną koncepcję czy jednak faktyczną implementację "wszystkiego"?

Po dwóch dniach zgłębiania się w tematykę i próby przełożenia paradygmatu na praktyczną aplikację (chociażby aplikacja p.t. faktura + klienci) intuicja podpowiada mi, że rozsądnym jest jednak tworzyć klasy, w których wewnątrz już faktycznie trzymamy się logiki funkcyjnej ( do momentu spotkania z I/O).

p.s.
No na koniec zupełnie luźna refleksja... Programowanie funkcyjne wydaje mi się być doskonałą formą przejściową w drodze do automatyzacji pisania programów przez sztuczne inteligencje lub algorytmy ewolucyjne... Więc zastanówmy się czy popularyzując ten temat jako programiści sami sobie nie kopiemy grobu :-)

2

Tu masz gościa który dużo gada o tym jakie to FP przecudowne i nawet piszę w tym rzeczy typu driver do postgres'a: https://github.com/tpolecat/skunk
Polecam też jego talki na YT choć jestem "category theory"-sceptykiem. Domyślasz się że gość jest hardcorem i wszystko pisze przez monadę IO :P

1

@katakrowa - A możesz polecić jakieś fajne filmy, gdzie jest to sensownie pokazane? Bo sam do tematu podchodziłem parę razy i zawsze kończyło się na jakichś ogólnikach, sloganach i deklaracjach rzucanych przez prowadzącego wykład, ale nie potrafił on nigdy podać jakichś konkretów i życiowych argumentów uzasadniających korzystanie z takiego podejścia. Nie znalazłem żadnego sensownego (poza tym, że jest to modne hasło i pewnie łatwiej będzie znaleźć prace, jak w CV napiszesz, że jesteś dobry w FP) przykładu/argumentu, czemu takie coś ma być lepsze od takich rzeczy jak chociażby OP. I pisząc o sensownym przykładzie, nie chodzi mi o jakieś wydumane algorytmy czy sytuacje stworzone tylko po to, żeby były fajną ilustracją tezy autora, ale jakieś przykłady z życia codziennego. Bo, mimo kilku prób, na coś takiego nie trafiłem.

Dla mnie funkcyjne to jest taka trochę zabawa/fetysz. OK, jest to coś nowego, coś innego, wymaga dużej wiedzy i doświadczenia, ale tak naprawdę to średnio się może przydać w codziennej pracy, a nawet pchanie tego na siłę (piszę o typowej pracy - tworzenie jakiejś aplikacji typu ERP, pisaniu Cruda, może jakaś gierka na komórkę itp.) mogę uznać za dodatkowe i niepotrzebne komplikowanie sobie życia.

0

@katakrowa:

Gdzie znaleźć przykłady "większych" programów napisanych z zastosowaniem tego paradygmatu? Proste przykłady są piękne ale chciałbym zobaczyć starcie tego typu programowania np. z bazą danych, plikami, HTTP.

Zobacz, któreś tam powinne być open source.

3

Musisz sobie tylko odpowiedzieć co ta funkcyjność w rzeczywistości zmienia, bo jak by tak się zastanowić nad samym paradygmatem to można dojść do wniosku, że jest tutaj pewien design, rozszerzalność, elastyczność i sposób na pisanie testowalnego kodu, ale OOP też to oferuje. Więc na dłuższą metę możesz uznać, że samo FP nie wiele Ci da.

By móc lepiej wdrożyć się w FP zauważ pewną ewolucje jaka następuje:

1) Przykładowo w języku C, byłeś bliżej komputera, Twój program jako całość jest jak maszynka, zarządza stanem (a Twoje dane to niekoniecznie wartości, to bardziej miejsca jakie zmieniasz, aktualizujesz), a także umożliwia zarządzanie pamięcią, może pisać własny allocator, operować wskaźnikiem na wskaźnik.

2) Jak piszesz w języku pokroju Java to patrzysz na kod z perspektywy obiektów. Teraz każdy Twój obiekt jest jak maszynka (też występuje postrzeganie danych jako miejsc które aktualzujesz), ale mniejsza więc łatwiej możesz taki obiekt załadować do swojej głowy, i łatwiej jest modyfikować kod, redukujesz ryzyko pomyłki.

3) W FP wychodzi z założenia, że obiekt (maszynka) + obiekt (maszynka) to problemy i że lepiej pracować w oparciu o dane, bo dane + dane to wciąż dane. Stąd w FP Twoim materiałem na jakim pracujesz są niemodyfikowalne struktury, dzięki temu to co robisz staje się bardziej przewidywalne, zwłaszcza w sytuacji współdzielenia. Także FP po prostu narzuca Ci pewne dodatkowe ograniczenia oddolnie, ale dzięki temu zmniejszasz ryzyko błędów jakie mógłbyś popełnić w programie.

Czy warto? Z perspektywy niskopoziomowego speca.. to nie wiem. Ktoś kto jest wybitny w C uzna, że wysokopoziomowe deklaratywne g'wna nic mu nie dają i w pewnym sensie będzie mial wciąż rację.

Natomiast języki jakimi operujemy, one nie dają nam nowych możliwości, one po prostu odbierają nam kontrolę za cenę większej przewidywalnosci :-(

W FP programowanie jest na początku trudne, bo ciężko stwierdzić jak programować programy gdzie jest występuje duża interaktywność (wymiana danych w obie strony), ale jak poświęcisz na ten temat 2-3 lata wówczas cały nakład się zwraca, i okazuje się, że FP pod kątem interaktywności ma więcej do zaoferowania programiście niż OOP.

2

U mnie "Core" systemu stara się być funkcyjne (C#) - mamy swoją implemetację Resultów, jedyny problem jest to, że nie ma stackTrace, bo wyjątki nie bublują, ale są łapane w blokach kontynucji resultA.mapTry(x => { throw new Exception(); }), ale z drugiej strony przez opakowania jak
OneOf<A, B>
Optional<A>
Kod krzyczy, co robi, co przyjmuje, i nie ma wyjątków latających po systemie ;)

Jeżeli ktoś tego nie czuje to polecam

, otwarło mi troszkę oczy na ten sposób programowania nawet jak już rok byłem w projekcie, ale szczerze dopiero po tym jutubie zajarzyłem "czemu tak lepiej" ;)

0
katakrowa napisał(a):

Po dwóch dniach zgłębiania się w tematykę i próby przełożenia paradygmatu na praktyczną aplikację (chociażby aplikacja p.t. faktura + klienci) intuicja podpowiada mi, że rozsądnym jest jednak tworzyć klasy, w których wewnątrz już faktycznie trzymamy się logiki funkcyjnej ( do momentu spotkania z I/O).

Znalazłem taki artykuł o "wadach" FP. Na początku dałem sie nawet wkręcić na kilka akapitów, zanim zatrybiłem. Wykrzywione to ekstremalnie, ale czy nie ma gość trochę racji hejtując OOP?

1

Musisz sobie tylko odpowiedzieć co ta funkcyjność w rzeczywistości zmienia, bo jak by tak się zastanowić nad samym paradygmatem to można dojść do wniosku, że jest tutaj pewien design, rozszerzalność, elastyczność i sposób na pisanie testowalnego kodu, ale OOP też to oferuje. Więc na dłuższą metę możesz uznać, że samo FP nie wiele Ci da.

Paradygmat nie jest po to żeby zwiększać możliwości, tylko je ograniczać. Np. programowanie funkcyjne ma na celu ograniczyć mutowalność, side-effecty itp.
Ale te ograniczenia w dużej części są dobre, zwłaszcza ograniczenia mutowalności.
Ja powiem szczerze że nie rozumiem do końca polimorfizmu funkcyjnego :(

4
cerrato napisał(a):

@katakrowa - A możesz polecić jakieś fajne filmy.

Jedynie tyle co sam obejrzałem:

( szczerze mówiąc wypowiedź Jarka zachęciła mnie do zgłębienia tematu ).
( dzięki temu zajarzyłem istotę )
I ciekawe jeszcze były:

Generalnie skłaniam się ku wykorzystywaniu tej metody w PHP i JS. Jest dużo w tym całym Hashellu i skali ale zupełnie tych języków nie kumam...

Dla mnie funkcyjne to jest taka trochę zabawa/fetysz. OK, jest to coś nowego, coś innego, wymaga dużej wiedzy i doświadczenia, ale tak naprawdę to średnio się może przydać w codziennej pracy, a nawet pchanie tego na siłę (piszę o typowej pracy - tworzenie jakiejś aplikacji typu ERP, pisaniu Cruda, może jakaś gierka na komórkę itp.) mogę uznać za dodatkowe i niepotrzebne komplikowanie sobie życia.

Ja zaczynam czuć, że to ma sens. W sumie w czystym C albo innych językach nie obiektowych też da się pisać obiektowo i często robiło się to nawet nieintencjonalnie. Podobne "deja vu" mam właśnie z konstrukcjami programowania funkcyjnego.

pan_krewetek napisał(a):

W FP programowanie jest na początku trudne, bo ciężko stwierdzić jak programować programy gdzie jest występuje duża interaktywność (wymiana danych w obie strony), ale jak poświęcisz na ten temat 2-3 lata wówczas cały nakład się zwraca, i okazuje się, że FP pod kątem interaktywności ma więcej do zaoferowania programiście niż OOP.

No i właściwie to jest to co próbuję zrozumieć bo ogólną ideę FP już zaczynam "czuć".

4

@katakrowa @cerrato @jarekr000000 @KamilAdam
znalazłem (ponoć, nie weryfikowałem czy działa :P) implementacje Quake w Haskellu
https://github.com/ocharles/zero-to-quake-3

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0