Jaki język funkcyjny?

3

Chciałbym zapoznać się z programowaniem funkcyjnym i zastanawiam się nad językiem, który mi na to pozwoli. Sprawdzałem Scalę, ale przez możliwość pisania w nim OOP uznałem, że będzie mnie zwodzić w tę stronę oraz sprawdzałem Elma i fajnie się w nim pisze, ale czytałem, że jest pozbawiony wielu featurów. Haskell pewnie okaże się dla mnie zbyt skomplikowany, a też nie chcę dla zajawki poświęcać na to więcej czasu, niż na język, w którym obecnie pracuję, bo jeszcze bardzo wielu rzeczy nie wiem.

Z tego co tam na razie wypatrzyłem, to skłaniał bym się ku Elixirowi najbardziej albo Clojure, Racket. Jaki język polecacie?

4

Ale po co chcesz programować funkcyjnie? Jeśli chodzi o poszerzenie horyzontów to wg mnie lepiej iść w stronę silnie, statycznie typowanych - Haskell, OCaml, F#, Scala. Z naciskiem.na Haskell, bo ma elegancka składnie i wszystko czego można oczekiwać od języka funkcyjnego. Może za wyjątkiem typów zależnych, ale w razie czego Idris wygląda jak Haskell.

2

Haskell FTW. Jak tylko przebrniesz przez nieco nieintuicyjne komunikaty o błędach powinno być spoko. Najlepszy język jaki znam. Scala też jest spoko jeśli nie chcesz zbytniej zmiany.

4

Haskell. Dużo materiałów do nauki, dobrej jakości. W odróżnieniu od Scali nie robi się "imperatywnych skrótów".
Do tego jest prosty - można sobie zrobić ten Haskell skomplikowanym... ale nie trzeba.

3

Perl. Można napisać coś przydatnego a nie tylko zabawki.

0
PerlMonk napisał(a):

Perl. Można napisać coś przydatnego a nie tylko zabawki.

Jakby nie kręcić nosem, historia potwierdza

3

Erlang - fajnie płacą jak już jest praca w tym języku. Trochę odżył przez blockchaina

0

Ja bym się podpiął pod temat, dodając od siebie że chyba w przypadku nauki FP sam język nie ma aż takiego znaczenia co dostępność materiałów do nauki tego paradygmatu w tym właśnie języku. A z tego co sam jakiś czas temu próbowałem to już nie wygląda tak kolorowo. Ja wybrałem F# jako że na codzień używam C#, więc pozostanie w tym samym środowisku (.Net, Visual Studio ) to o jedną przeszkodę w nauce mniej. Problem w tym że tak naprawdę materiałów do nauki od podstaw do napisania jakiejś konkretnej aplikacji w zasadzie nie ma. Trzeba więc zbierać strzępki informacji z różnych źródeł, które często są przestarzałe.

Jeśli ktoś ma jakiś język FP do którego jest jakiś dobry kurs/książka gdzie ucząc się tego języka, uczymy się również paradygmatu i to wszystko praktycznie, pisząc jakąś aplikację (np. aplikacja webowa), to proszę o sugestie.

0
Aventus napisał(a):

Ja bym się podpiął pod temat, dodając od siebie że chyba w przypadku nauki FP sam język nie ma aż takiego znaczenia

O ile nie będzie to Java. xD

1

@elwis: wiadomo :P Może źle sformułowałem co miałem na myśli. Oczywiście chodzi o język funkcyjny, który czym bardziej utrudnia pisanie nie-funkcyjne tym lepiej. Ale równie ważnym kryterium jest dostępność porządnych materiałów do nauki- nie tylko nauki składni, ale właśnie praktycznej nauki programowania funkcyjnego.

2

Fajne są funkcyjne języki, nie daj się odciągnąć od pomysłu. Ja bym szedł w Clojure albo Haskell. ClojureScript też jest fajny.

3

Polecę to na czym się znam, czyli Scalę. Wersja 3.0 jest już całkiem przyzwoita, ma porządne IDE (IntelliJ), można budować SBT lub Gradle, działa debugger. Ale najlepszy "selling point" to możliwość użycia prawie każdej Javowej biblioteki. Poza tym biblioteka ZIO jest jedną z najnowszych innowacji jeżeli chodzi o komercjalizację programowania funkcyjnego. Także Scala 3.0 + ZIO.

Wady: przekombinowany kod bibliotek (ale i tak jest o niebo lepiej niż w Haskellu), dramy (select_random(kobiety_w_it, lgbt, code_of_conduct, black_lives_matter)) w społeczności.
Czytelność kodu również pozostawia wiele do życzenia, czasami trzeba się nieźle namęczyć żeby zrozumieć o co autorowi chodziło (niestety jest to wada wszystkich funkcyjnych języków programowania o mocy HKT), przykład: https://github.com/scala/scala/blob/2.13.x/src/library/scala/concurrent/Future.scala#L859

Z innych próbowałem Haskella i niestety muszę przyznać że język super (niektórzy mówią Haskell to język XXII wieku), ale cała otoczka liby, ide są strasznie mizerne.

Na studiach bawiłem się LISPem. W ankiecie mamy niestety tylko Clojure ale brak CommonLisp'a. Generalnie te same problemy co w Haskellu w przypadku CommonLisp'a - ale język warto znać, choćby ze względu na swoistą składnie.

Jakbym był .NET'owcem to bym brał F#. Co prawda brak (jak ostatni raz sprawdzałem) HKT ale dzięki temu mamy łatwiejsze wejście do programowania funkcyjnego.

2

Zastanawia mnie jednak kwestia podejścia. Czy nie lepiej uczyć się takiego paradygmatu na języku jaki się zna? Nie trzeba się wtedy męczyć z całą otoczką, stawianiem środowiska, konfiguracją IDE, nauką kruczków danego języka?
Ja np. na co dzień robię w PHP. Kiedyś znalazłem tą książkę: https://www.amazon.pl/Functional-Programming-PHP-2nd-architect/dp/1940111463
I próbowałem trochę pokodować.
Czy jednym słusznym podejściem jest odcięcie pępowiny i przejście na inny język, dedykowany konkretnemu paradygmatowi?

1

Właśnie, jest jakieś dobre IDE do Haskella? Albo może czy jest jakieś haskellowe LSP wysokiej jakości?

Jak się z tym miziałem milion lat temu, to spod Emaksa, i trochę cierpiałem przy tym.

2

@jurek1980: No właśnie czytam teraz o programowaniu funkcyjnym w Typescripcie. Pisał ktoś funkcyjnie w TSie? Jakie wrażenia?

Chyba i tak lepiej samą naukę FP ogarniać w czystym języku. Spróbuję chyba Haskella na podstawie tego co piszecie, a jak się odbiję, to może Scalę. Clojure mnie kusił przez składnie Lispa, ale nie jest statycznie typowany, więc raczej dam sobie spokój.

2
jurek1980 napisał(a):

Zastanawia mnie jednak kwestia podejścia. Czy nie lepiej uczyć się takiego paradygmatu na języku jaki się zna? Nie trzeba się wtedy męczyć z całą otoczką, stawianiem środowiska, konfiguracją IDE, nauką kruczków danego języka?
(...)
Czy jednym słusznym podejściem jest odcięcie pępowiny i przejście na inny język, dedykowany konkretnemu paradygmatowi?

Moim zdaniem to drugie, bo będąc rzuconym na głęboką wodę łatwiej uniknąć pisania w znanym już sobie paradygmacie. Poza tym- i to bardzo ważne- języki funkcyjne często mają różne właściwości i funkcjonalności których inne języki nie mają. Da się to obejść tworząc jakieś inne implementacje które będą przypominać odpowiedniki z języków funkcyjnych, ale to raczej robota dla kogoś kto już zna FP, a nie dla kogoś kto dopiero się uczy. Pierwszy przykład jaki mi przychodzi do głowy to Discriminated Unions w F#, i ich brak w C#.

0

Nie znam wszystkich tych języków, ale Elixir jest całkiem przyjemy. Zdecydowanie niższy próg wejścia niż Haskell. Erlang to praktycznie Elixir z gorszą składnią.

2

No właśnie, czytam tu wątki i pytania o IDE do Haskella, informacje typu "jest debugger". No jak żyć bez debuggera, można coś printowac, ale czego obawiam się, że po 3 dniach szukania IDE, konfiguracji itd. po prostu człowiek ma dość, a nawet nie zaczęło się tematu. No nic, jak mnie kiedyś znów najdzie to spróbuję języka dedykowanego do FP.
Po prostu miałem podobne pytania co OP i chciałem ten temat troszkę rozszerzyć.

3
jurek1980 napisał(a):

No właśnie, czytam tu wątki i pytania o IDE do Haskella, informacje typu "jest debugger". No jak żyć bez debuggera, można coś printowac, ale czego obawiam się, że po 3 dniach szukania IDE, konfiguracji itd. po prostu człowiek ma dość, a nawet nie zaczęło się tematu. No nic, jak mnie kiedyś znów najdzie to spróbuję języka dedykowanego do FP.
Po prostu miałem podobne pytania co OP i chciałem ten temat troszkę rozszerzyć.

Debugging step by step w Haskellu? To jest inny świat, tam nie ma step by step. Jak się kompiluje to znaczy, że działa.

VS Code wg mnie bardzo dobrze sobie radzi z Haskellem.

Haskell jest wręcz idealny do nauki. Jest bardzo dużo źródeł, świetnych książek, artykułów, większość konceptów funkcyjnych pokazuje się na Haskellu. Tooling, IDE itd. to mogły by być istotne przy pisaniu dużych projektów, a nie na nauce, gdzie cały kod może mieścić się na jednym ekranie. A próg wejścia jest minimalny - ghci + putStrLn i mamy Hello World.

5

IDE do haskella.

Będziecie się śmiać... IntelliJ - serio. Szału nie robi, ale jest nawigacja po kodzie i podpowiadanie, mi wystarczało.
VSC podobno nawet lepszy, ale nie używam (nie daje rady ze skrótami klawiszowymi).

https://betterprogramming.pub/haskell-vs-code-setup-in-2021-6267cc991551

0

Jak się kompiluje to znaczy, że działa.

Słyszałem już ten argument wielokrotnie ale nadal ciężko mi w to uwierzyć. Mam wrażenie że to trochę widzenie świata FP przez różowe okulary, i pomijanie tego co napisane małym druczkiem ;)

gdzie cały kod może mieścić się na jednym ekranie

No i to jest właśnie ten problem. Ja chcę się uczyć na rzeczywistych przykładach, np. funkcyjnie pisząc serwis webowy. Nie pisząc krótkie przykłady na kilka(naście ) linii kodu.

1
Aventus napisał(a):

No i to jest właśnie ten problem. Ja chcę się uczyć na rzeczywistych przykładach, np. funkcyjnie pisząc serwis webowy. Nie pisząc krótkie przykłady na kilka(naście ) linii kodu.

Wg mnie to błąd. To tak jakby ktoś kto pisze swoje pierwsze programy dostał radę, żeby wziął się za REST a klas i obiektów douczy się później.

Pisanie REST w dowolnym języku jest łatwe. Bierzesz bibliotekę i masz. Możesz jej nawet nie rozumieć. Ucząc się funkcyjnego trzeba to rozumieć- po co innego się go uczyć?

A przykłady na kilkanaście linii kodu, np. RWS, reverse state monad, jakieś zippery, cykliczny bufor w haskellu, parsery mondyczne, monad transformers, optykki, przykłady na wykorzystanie GADT to już w kilkunastu linijkach będą powodować bol głowy i dluzsza rozmine. W dużych programach ludzie pomijają skomplikowane rzeczy, bo ktoś już to zrobił za nich.

0

@Saalin: nie do końca. Co z tego że nauczę się składni jakiegoś języka i teoretycznych zagadnień typu pisanie czystych funkcji, skoro szybko zderzę się z rzeczywistością kiedy będę chciał napisać web endpoint lub wypisać coś do konsoli, czyli będę miał efekty uboczne?

4

Co do deguggera.
Pracuję od iluś miesięcy jako głównie haskell developer i potrzeby debugowania w pracy nie miałem nigdy. Główny problem to faktycznie taki, że kod się nie kompiluje, bo jak się skompiluje to już problemu nie ma. A jakby co to są testy.

Natomiast, kiedy napierniczałem advent of code w haskellu to faktycznie - kilka razy się debugger przydał, używałem ghci debuggera (command line). Trochę bieda.

0
Aventus napisał(a):

@Saalin: nie do końca. Co z tego że nauczę się składni jakiegoś języka i teoretycznych zagadnień typu pisanie czystych funkcji, skoro szybko zderzę się z rzeczywistością kiedy będę chciał napisać web endpoint lub wypisać coś do konsoli, czyli będę miał efekty uboczne?

ale to kwestia kolejnosci a nie calkowitego ominiecia tematu

4
Aventus napisał(a):

@Saalin: nie do końca. Co z tego że nauczę się składni jakiegoś języka i teoretycznych zagadnień typu pisanie czystych funkcji, skoro szybko zderzę się z rzeczywistością kiedy będę chciał napisać web endpoint lub wypisać coś do konsoli, czyli będę miał efekty uboczne?

Nie będziesz miał efektów ubocznych, jeśli zrobisz to po haskellowemu - da się.

Trzeba rozróżnić język - od implementacji/ runtime. Haskell pozwala Ci pisać (prawie) wszystko zupełnie czysto (bez efektów ubocznych). Mimo, że kiedy kod już działa to faktycznie jakieś tam rzeczy w hardware się dzieją (olaboga).

(aczkolwiek w GHC są haki pozwalające pisać nieczysto (np. unsafePerformIO)).

1

To moze ja powiem tak, najpierw to, a pozniej web service (niekoniecznie do poziomu expert ofc :P) natomiast ludzie z reguły zostają na novice bo udało im się folda użyć.

screenshot-20220325104100.png

1

To moze ja powiem tak, najpierw to, a pozniej web service (niekoniecznie do poziomu expert ofc :P) natomiast ludzie z reguły zostają na novice bo udało im się folda użyć.

Nie zgadzam się zupełnie.
Nawet zupełne podstawy wystarczą, żeby robić jakies web serwicy w Haskellu ... i uczyć się praktycznie jak wygląda to całe fp.
(Btw. pracuje na full etat funkcyjnie i jestem gdzieś na poziomie competent... - robimy webserwisy i dużo innych rzeczy, które nawet działają).

0
jarekr000000 napisał(a):

To moze ja powiem tak, najpierw to, a pozniej web service (niekoniecznie do poziomu expert ofc :P) natomiast ludzie z reguły zostają na novice bo udało im się folda użyć.

Nie zgadzam się zupełnie.
Nawet zupełne podstawy wystarczą, żeby robić jakies web serwicy w Haskellu ... i uczyć się praktycznie jak wygląda to całe fp.
(Btw. pracuje na full etat funkcyjnie i jestem gdzieś na poziomie competent... - robimy webserwisy i dużo innych rzeczy, które nawet działają).

Pierwsze pytanie jakie zadałem w wątku to po co się uczyć funkcyjnego? Ja zakładam, że dla poznania nowych rzeczy, a nie żeby mieć kolejny język do klepania. Czy da się w Javie, nie znając praktycznie Javy pisać w Springu? No pewnie, że się da. Ale z jakiegoś powodu ludzie hejtują taki sposób nauki.

0

@Saalin: Tak, jest tak jak mówisz. Nie planuję zmieniać języka, jestem ciekawy jak się pisze funkcyjnie, a podobno można z tego wynieść wiedzę, która pomoże w pracy w TS/JS.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.