Programowanie funkcyjne z Arrow, Scalaz, cats, vavr itp. - korzystacie?

Programowanie funkcyjne z Arrow, Scalaz, cats, vavr itp. - korzystacie?
azalut
  • Rejestracja:około 12 lat
  • Ostatnio:ponad rok
  • Postów:1129
4

cześć,
korzystacie w swoich projektach z rozszerzeń do programowania funkcyjnego?
jeśli tak, to z jakich i jak oceniacie ich wpływ na kod (benefity) i learning curve który wprowadzają do projektu?

widzicie realne benefity czy tylko hype na FP?

szczególnie interesuje mnie temat w projektach z kotlinem/scalą, ale java + vavr również

dzięki :)

edytowany 1x, ostatnio: azalut
TS
  • Rejestracja:prawie 5 lat
  • Ostatnio:ponad 4 lata
  • Postów:394
0

Po co korzystać z rozszerzeń do programowania funkcyjnego jak się pisze w języku funkcyjnym?

azalut
  • Rejestracja:około 12 lat
  • Ostatnio:ponad rok
  • Postów:1129
4

@tsz dlatego że wprowadzają zazwyczaj więcej funkcyjnych elementów (typeclasses, abstrakcje itd.) niż istnieje w corowym języku - np scali, kotlinie

edytowany 1x, ostatnio: azalut
jarekr000000
  • Rejestracja:ponad 8 lat
  • Ostatnio:dzień
  • Lokalizacja:U krasnoludów - pod górą
  • Postów:4707
2

To są różne poziomy:
VAVR - oczywiście, ale to nie żadne specjalne fp. To po prostu kolekcje, które w odróżnieniu od tych z java.util. są zdatne do użytku. (+ smaczki typu Either, Option - ale to takie fp poziom 1).
Używam vavr również w kotlinie mimo, że jest tam null safety i mimo, że kolelekcje są mniej problematyczne niż w javie.
Tu odpowiadam na zarzut, który może się pojawić - to nie tak, że java.util. jest totalnie złe - to są niskopoziomowe rozwiązania, które mogą być przydatne w jakimś 1 promilu kodu, w całej reszcie są upierdliwe (przez słabe API) i (niebezpieczne (przez mutowalność) lub nieefektywne) .

arrow-kt nigdy jeszcze sensownie nie użyłem, bo - nie rozwiązuje problemu kolekcji i wchodzi mi w konflikt z Vavr (przez Either). Przez braki kotlina - nie wiem czy to kiedykolwiek będzie miało sens - brak HKT powoduje, że wiele fajnych funkcji (typu mapM z haskella) nie da się napisać (wiem, że arrow - próbuje to łatać jakieś pluginami do kompilatora... ale mnie takie rzeczy raczej zniechęcają (przypomina mi się lombok i adnotacje).

Scala - używałem troche ScalaZ, głównie ze względu na Task. Który to jest niezepsutym Future, a troszkę jak monada IO. Jeśli chcemy iść w pełne FP i obsługiwać efekty uboczne to tego typu biblioteki się przydają.
W scali troszke reset w tej działce zrobił John De Goes z biblioteką Zio - monada IO na nowo. Ale nie mam z tym doświadczeń - z daleka podoba mi się.
Gdybym więcej w tej Scali pisał to pewnie by to zaszło dalej.


jeden i pół terabajta powinno wystarczyć każdemu
edytowany 4x, ostatnio: jarekr000000
azalut
btw like za avatar :)
azalut
  • Rejestracja:około 12 lat
  • Ostatnio:ponad rok
  • Postów:1129
2

dzięki @jarekr000000 za odp

a jak oceniasz korzyści vs learning curve w projekcie po wprowadzeniu takich bibliotek?

tematy fp raczej nie są trywialne, a jeśli projekt pójdzie w fp to wyobrażam sobie, że znacznie podwyższa to zrozumienie kodu dla kogoś kto dużego pojęcia o fp nie ma i nagle widzi wszędzie dziwne konstrukcje

ma to wymierne korzysci?

edytowany 1x, ostatnio: azalut
jarekr000000
  • Rejestracja:ponad 8 lat
  • Ostatnio:dzień
  • Lokalizacja:U krasnoludów - pod górą
  • Postów:4707
1

vavr to generalnie jest prawie żaden learning curve. wręcz dużo mniej trzeba umieć niż przy standardowych kolekcjach.|
Korzyści to są takie, że nie potykamy się o własne nogi i to widać. Vavr + Option jak wlezie w projekt to od razu widać poprawę (w javie).

Jedynie nad eitherem jest dyskusja, ale to wręcz 1-1 ta sama dyskusja co kiedyś nad exception handling i checked vs runtime exception. Tylko zamiast checked exception wpada Either i wszystko ma nawet większy sens niż wcześniej. Z drugiej strony - jakbym miał w dolarach zmierzyć korzyści z samego Eithera vs Exceptions to te akurat są niespecjalne różnice. To już bardziej kwestia religijna i nie kruszę o to kopii.

W kotlinie jest ciekawszy problem: Option<T> vs T?. I czy warto iść w vavr skoro kotlinowe kolekcje nie są aż tak problematyczne. Tu zdania są podzielone. Przy czym nie ma problemu z uczeniem, problem jest z tym, że nie każdy widzi sens (w kotlinie) i nawet to rozumiem. Na pewno zysk z vavr jest istotnie mniejszy niż w javie.
Ja tego vavra w kotlinie uzasadniałem tym, że dzieki temu mamy spójne i ładne API dla kodu w javie ( mam projekty mieszane kotlin + java).
Z tym, że praktyka pokazała, że i tak nowy kod powstaje raczej w kotlinie, więc tak naprawdę nie ma specjalnie tej potrzeby....

Co do Scali - powiedzmy sobie uczciwie - mam tu słabe doświadczenia z pracy w zespole (złożonym z typowych javowców), właśnie z tym, że ludzie nie ogarniali - bardziej niż tego oczekiwałem. Dlatego jadę w ten kijowy kotlin - jak się ludzie nauczą w kotlinie w miarę pisać - to pewnie znowu będę zachecać do Scali. Przy czym tu problemem nie były raczej biblioteki fp , a sama Scala i ekosystem - za dużo do nauczenia. Nie doceniłem tego. Można szybko zrobić z javowców zespół piszący w Scavie. Ale taki zespół jest bezradny przy próbie korzystania z typowych Scalowych bibliotek (oraz stack overflow). Scala to jezyk, którego nie da się nauczyć metodą na rympał (IMO).


jeden i pół terabajta powinno wystarczyć każdemu
edytowany 5x, ostatnio: jarekr000000
S9
  • Rejestracja:ponad 10 lat
  • Ostatnio:6 miesięcy
  • Lokalizacja:Warszawa
  • Postów:3573
1

VAVRa jest raczej łatwo się nauczyć ;)
Ciekawą, inną zaletą VAVRa jest to że ichniejszy Option jest serializable


"w haśle <młody dynamiczny zespół> nie chodzi o to ile masz lat tylko jak często zmienia się skład"
azalut
  • Rejestracja:około 12 lat
  • Ostatnio:ponad rok
  • Postów:1129
2

ok dla takich typów jak Option czy Either to ja widzę wymierny zysk

zastanawiają mnie bardziej złożone konstrukcje np IO z Arrowa - widzę, powiedzmy, w tym benefit ale czy jest na tyle duży, żeby to wprowadzać - mając na uwadzę ilość WTFów które poleci jak ktoś pierwszy raz zobaczy kod... to sam nie wiem

gdzie IO to obok Either czy Option raczej popularna konstrukcja; Arrow ma ich wiecej, nie mówiąc o scalaz

jarekr000000
  • Rejestracja:ponad 8 lat
  • Ostatnio:dzień
  • Lokalizacja:U krasnoludów - pod górą
  • Postów:4707
1

Jak dla mnie to zależy od zespółu. A ja w zasadzie nigdy nie byłem w zespole, gdzie byłby sens wprowadzenia arrow lub cats, scalaz. Za dużo kroków.
Jak się pisze samemu lub w małym zespole do tego/na konferencji/warsztatach - bez męczącego głowę biznesu, to nawet najgłupsze praktyki całkiem się sprawdzają, więc nie bardzo można z tego wyciągać wnioski.
(na dziś mój wniosek byłby taki - jak już mamy użyć arrow, ScalaZ, Cats... to czemu nie napiszemy tego po prostu w Haskellu? paru moich znajomych zresztą przelazło na Haskella (po scali)).
EDIT:
w tym sensie sam sobie odpowiedziałem na pytanie i widzę::
biblioteki fp do kotlina, scali pozwalają Ci ogarnąć programowanie funkcyjne i służą jako pomost do Haskella. Bo prędzej czy póżniej ogarniesz, że te języki jednak się do pełnego fp nie nadają (niszczą wiele z korzyści).
Kotlin to totalny dramat - szkoda dyskutować.
A Scala ma jedną, ale paskudną wadę - ma statementy. Mnie to mocno odrzuca. Wiadomo, że nawet haskell ma IO () - czyli taki haskellowy void, ale ryzyko popełnienia przypadkowego błędu na tym jest dużo niższe niż w Scali. Niestety, z tego co kojarzę w Scali 3 nic jeśli chodzi o statementy się nie zmienia (very szkoda).


jeden i pół terabajta powinno wystarczyć każdemu
edytowany 9x, ostatnio: jarekr000000
Wibowit
jak już mamy użyć arrow, ScalaZ, Cats... to czemu nie napiszemy tego po prostu w Haskellu? - bo nie ma IDE do Haskella od JetBrainsów :]
jarekr000000
Tak po prawdzie to jest plugin, który całkiem spoko działa. Ma nawet troche wodotrysków.
vpiotr
  • Rejestracja:ponad 13 lat
  • Ostatnio:prawie 3 lata
0

Dlaczego nikt tu jeszcze nie wspomniał o Clojure?

DQ
  • Rejestracja:prawie 10 lat
  • Ostatnio:6 miesięcy
  • Postów:141
2

Z perspektywy Scali to dodanie cats daje bardzo dużo nawet jeśli nie stosujesz hard FP. Jest bardzo dużo zdefiniowanych metod, które przydają się tak po prostu na codzień. Jeśli chodzi o próg wejścia to wszystko zależy od tego jak bardzo idziesz w FP:

  • Projekt oparty o Scalowy Future wymaga tak de facto znajomości Scali. Zazwyczaj w projektach masz dodane chociażby zwykłe cats, ale głównie z powodu który wymieniłem na początku.
  • Projekty oparte o Monix/Cats-effect wymaga już więcej od programisty. Często musi ogarniać hierarchię type class, koncepty co i gdzie ma sens i po co to wszystko. Tutaj bym powiedział, że ktoś musi dość dobrze ogarniać Scalę i znać chociaż podstawowe koncepty FP żeby w dość sensownym czasie zacząć korzystać z tych bibliotek.
  • ZIO - nie mam zbyt dużo doświadczenia w nim ale reklamują jako "noob friendly". W teorii bardzo dużo rzeczy masz do użytku out of the box, a w praktyce jak próbowałem zrobić kilka rzeczy to to wcale tak kolorowo nie wygląda i błędy w konsoli potrafią straszyć ;)
  • Tagless final i inne cuda - największy próg wejścia, aktualnie hype spada i jest stosowany głównie w bibliotekach. W kodzie aplikacyjnym aktualnie jest coraz częściej uznawane jako anty-pattern

Ostatnio się rekrutowałem i odnoszę wrażenie, że w większości projektów są dodane koty (nie było rozmowy gdzie by się o to nie pytali ;)). Hard FP występuje zdecydowanie rzadziej bo musi być w zespole chociaż jedna czy dwie osoby które rozumieją biblioteki, wiedzą po co są, a i jeszcze muszą nauczyć pozostałą część zespołu co i jak.

Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)