Monady - wątpliwości

0

Od pewnego czasu po przeczytaniu artykułu o polach monadowych w Javie :)))) :D :D nieustannie dręczą mnie pewne wątpliwości. :"( :( :(

Czy Map i Select z LINQ w .Net to jest to samo? :P ? :P ? Wiem że robią to samo ale jakoś tak dziwnie to wygląda

optiona.Select(x => x);
optiona.SelectMany(x => x.GetId());

A może
optiona.FlatSelect(some);

Jeśli używam optionala to jak powinienem nazywać metody?? :O :O

MaybeGetItem
GetOptionalItem
TryGetItem
??? :O :O :O

Kiedy używać Try a kiedy Either ?? :O :O
Jaka to różnica? ?_? :P P

1

Co to są pola monadowe???

Monadami mogą być nie tylko kolekcje, ale także parsery (czegokolwiek, np: http://www.lihaoyi.com/fastparse/ ), generatory testów ( https://www.scalacheck.org/ ), monady I/O opakowujące efekty uboczne, wielozadaniowość, strumieniowanie, zarządzanie zasobami, etc ( https://github.com/scalaz/scalaz-zio ).

W monadzie oprócz istnienia określonych funkcji do operowania na danym typie (obowiązkowe są dwie: jedna to opakowanie w monadę, druga to flatMap/ bind/ zwał jak zwał), konieczne jest także przestrzeganie przez nie ściśle określonych reguł, po angielsku: monad laws. Jeśli dane struktury i metody tych reguł nie przestrzegają do końca to nie są monadami, a czymś co najwyżej monadopodobnym.

Kiedy używać Try a kiedy Either

Try jest takim częściowo sparametryzowanym Eitherem, tzn mniej więcej Try[A] = Either[Exception, A]. Jeśli chcesz przepychać Exceptiona używaj Try, jeśli chcesz przepychać coś innego wybierz Either.

1
Wibowit napisał(a):

Kiedy używać Try a kiedy Either

Try jest takim częściowo sparametryzowanym Eitherem, tzn mniej więcej Try[A] = Either[Exception, A]. Jeśli chcesz przepychać Exceptiona używaj Try, jeśli chcesz przepychać coś innego wybierz Either.

Nie używaj sam z siebie Try. To raczej rozwiązanie na opakowanie starego kodu, który z Exceptionów już korzysta.
Dodatkowo, z dziwnych względów, Try w Scali i w Javie (VAVR) jest zrypany i w pewnym sensie nie spełnia praw monad.
(O ile można w ogóle mówić o monad laws w Scali (czy javie i kotlinie))

0

@Wibowit

:D :D Dzięki za podpowiedź kolego, lubię cię, przypominasz mi czasy kiedy tata kupował mi wibowit w aptece koło przychodni. :D :D :D

Problem w tym, że ja nie rozumiem, dlaczego ludzie chcą przepychać exceptiony :( :( :( :( :O :O
Przecież exeptiona można zamienić na Either stringa z czymś tam :P :P a jak się rzuca exceptiona to po to, żeby zapewnić constrain i mieć stack track. :P :P :O Chyba... :O :O :O

Dodatkowo, z dziwnych względów, Try w Scali i w Javie (VAVR) jest zrypany i w pewnym sensie nie spełnia praw monad.
(O ile można w ogóle mówić o monad laws w Scali (czy javie i kotlinie))

To twój artykuł czytałem :D :D :D :) :))))) Ale fajnie, że się odezwałeś :D :D :D
A dlaczego nie spełnia praw monad.??? ? ? :O :O Przecież jest map, flatMap i jest opakowaniem na inny typ. :O :O :O

1
CukierkowyMaczo napisał(a):

Przecież jest map, flatMap i jest opakowaniem na inny typ. :O :O :O

Fakt posiadania map/flatMap i bycia opakowaniem na inny typ nie ma nic wspólnego z prawami -> https://wiki.haskell.org/Monad_laws

1
  1. Przez nagdorliwość twórców Try (w Scali) łapane sa wyjątki w map i flatMap. To intuicyjne dla javowca, ale chore z punktu widzenia fp.
  2. Łamane jest przez to left identity zwykle albo functor composition (monada to functor)
  3. Z drugiej strony jesli funkcje rzucają exceptionami to trudno mówić o jakiś prawach w ogóle.
    Ale generalnie mogli nie byc nadgorliwi - byłoby troche lepiej.

Z ciekawostek: - Optional.map w javie jest tak samo zrypany. Ale w VAVR już nie. VAVRowcy przywrócili porządek w Option, ale nie zrobili tego w Try.

Jezeli mamy jezyk imperatywny, bez wsparcia kompilatora dla monad i to złamane monad laws co najwyżej zaskakuja programistę.

0

Czy ja dobrze rozumiem...??? ;O :O Monada musi mieć zawsze dwa stany i wyłącznie metody (funktory) które operują na dwóch stanach.? :O :O :O ???

1

Nie wiem o czym piszesz? Jakie dwa stany?
W zasadzie musi mieć tylko stan 0 czyli opakowaną wartość. Option.some(x) to takie zero monadowe.
Either.right(x), Try.of(x) i Future.successful(x) to takie ZERA

0

Co to jest te "right identity" i "left identity"????? ;( Nie mogę tego zrozumieć, nie programuje funkcyjnie. ;( ;( ;( ;(

1

To olej. Będziesz chciał zrozumieć to jest dużo artykułów.
Nie musisz programować funkcyjnie żeby zrozumieć.
Nie musisz rozumieć, żeby funkcyjnie programować, albo żeby po używać tych monad (w javie, scali whatever).

Jak będziesz robił własna monade to wtedy warto się dowiedzieć.

0

No właśnie chcę sam taką zrobić w PHP wzorując się na tej z Javy i .Net. :D :D Dlatego jestem taki zakręcony ;( ;( :(

Możesz polecić jakiś łatwy w zrozumieniu artykuł.? :))))) :))
Teraz czytam to https://medium.com/coding-with-clarity/understanding-the-optional-monad-in-java-8-e3000d85ffd2

2

Ta prezentacja//www.slideshare.net/mariofusco/monadic-java
(niestety nie znalazłem dobrego video).
Potem rok tak programować.
Potem zacząc zabawę z haskellem.
I przeczytać to:
https://www.haskell.org/tutorial/io.html

I będzie jasne.

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