Skocz do zawartości
  • 👋 Witaj na MPCForum!

    Przeglądasz forum jako gość, co oznacza, że wiele świetnych funkcji jest jeszcze przed Tobą! 😎

    • Pełny dostęp do działów i ukrytych treści
    • Możliwość pisania i odpowiadania w tematach
    • System prywatnych wiadomości
    • Zbieranie reputacji i rozwijanie swojego profilu
    • Członkostwo w jednej z największych społeczności graczy

    👉 Dołączenie zajmie Ci mniej niż minutę – a zyskasz znacznie więcej!

    Zarejestruj się teraz

Blog MCT - Monady są jak burrito


Jaca777

Rekomendowane odpowiedzi

Opublikowano

.
 
 
 
 
 
 
 
 
 
 
 
 
  
  
 

   Monady w programowaniu istnieją od dawna. Od czasów APL (powstałego jeszcze przed Basic'iem) nazywano tak funkcję z jednym argumentem. Pierwszym językiem, do którego wprowadzono

koncepcje podobną do dzisiejszych monad, był Opal.
 

aceKkGogi.png

 
    Trudno znaleźć przykład monady w prawdziwym świecie, ale ich działanie jest proste, a możliwości wielkie - w tym dokonywanie operacji w przyszłości i kontrolowanie trzęsień ziemi (na pewno można to

tak ująć). Najprostsze jest porównanie jej do linii produkcyjnej, do której możemy dodawać nowe maszyny zmieniające przetwarzany produkt. Jednak, aby dodać nową maszynę, musimy skopiować całą

linię i ułożyć ją w innym miejscu wraz z nowym elementem.To oznacza, że monady są najczęściej niemodyfikowalne1 (immutable) - nie możemy zmieniać jej stanu, możemy jedynie skorzystać z niego przy
tworzeniu nowej. Pojęcie to występuje w teorii kategorii, ale wymagałoby to szerszych wyjaśnień, a nie jest konieczne do praktycznego zrozumienia. Na ten moment wystarczy wiedza o tym, że reprezentuje

to przejścia (morfizmy) między stanami obiektów.
 

751931440534414873334.png

 
    Znacznie łatwiej przedstawić monadę w języku programowania. Może to być zaimplementowane jako obiekt, który przechowuje pewną sekwencję operacji i przeprowadzi je na tym, co mu przekażemy. Przekazać mu te obiekty możemy przy jego tworzeniu lub potem, przykładowo wywołując metodę. Zawiera on zawsze dwie metody - w Scali jest to flatMap i apply (apply w Scali pozwala na użycie obiektu jak funkcji), a w literaturze częściej można spotkać się z bind i return. flatMap jako argument przyjmuje funkcję T => Monada[S], gdzie T to aktualny typ monady, a S to typ monady, która zostanie utworzona. Dodaje ona podaną w argumencie funkcję do kolejki operacji i zwraca monadę ją przechowującą. apply tworzy monadę przechowującą daną wartość i zwracającą ją bez modyfikowania. Warto zaznaczyć, że w mniej złożonej części przypadków nie jest

przechowywana funkcja, którą monada aplikuje do przechowywanych wartości, lecz sama wartość już odpowiednio zmodyfikowana. Monady często udostępniają o wiele więcej funkcji, które pozwalają na

jeszcze wygodniejsze manipulowanie wartościami.
 

950101440534684873334.png

 

    Ale co z tą przyszłością? W wielu językach istnieje monada Future. Wykorzystuje ona wartościowanie leniwe (lazy evaluation). Pozwala to na przekazanie wartości, która nie została jeszcze
obliczona i traktowanie jej jak zwyczajny obiekt - tj. dodawanie do niej, wypisywanie jej, itd. Wszystkie te operacje zostaną wykonane, gdy wartość zostanie obliczona. Do obliczenia jej wykorzystuje się
osobny wątek, więc nie blokuje to w żaden sposób głównego przepływu. Można tak dokonywać czasochłonnych obliczeń, bądź operacji wymagających czasu, jak np. oczekiwanie na odpowiedź od serwera , w
żaden sposób nie blokując głównego przepływu i nawet w najmniejszym stopniu nie zmniejszać czytelności kodu.

Future(readReallyBigFile).flatMap(sortWithBubblesort).foreach(println)

    Observable jest bardzo podobne do Future. Podobne w ten sam sposób, w jaki obiekt podobny jest do listy obiektów. Future przechowuje jedną wartość, a Observable wiele. Wartości w Observable
nie pojawiają się jednak jednocześnie. Możemy w ten sposób określić np. zachowanie programu w przypadku trzęsień ziemi. Gdy następuje trzęsienie ziemi, Observable otrzymuje o tym informację i
przekazuje to swoim subskrybentom, a po tym podejmuje decyzję, przykładowo o ewakuacji.

Observable(awaitEarthquake).repeat.filter(earthquakeInfo => earthquakeInfo.scale > 5.0).foreach(evacuate)

Jeśli kogoś ten temat zainteresował, to polecam książkę Scala in Depth i te dwa kursy:
https://www.coursera.org/course/progfun
https://www.coursera.org/course/reactive
 


monads_are_burritos.png



1Obiekty niemodyfikowalne stosuje się z wielu przyczyn. Nie są one zawsze najlepszym rozwiązaniem, ale czynią kod czytelniejszym i znacznie łatwiejszym do równoległego użycia - czyli takiego, do którego monady pasują idealnie.

 

Post: http://jaca77.blogspot.com/2015/08/monady-sa-jak-burrito.html

708121422388637873334.png

Opublikowano

Szczerze to niewiele zrozumiałem z artykułu ;) Chyba nie jestem targetem, a jeśli jest to skierowane do ogółu to przydało by się najpierw krótkie wprowadzenie do paradygmatu funkcyjnego. Natomiast temat mnie zainteresował, za co like.

Chcesz precyzyjnej i zrozumiałej odpowiedzi? - Zadaj precyzyjne i zrozumiałe pytanie. Nie przyjmuję zleceń.
Nie odpowiadam na priv na pytania, które można zadać na forum. Chcesz mojej pomocy - oznacz mnie w poście =>  @"Hans Kloss PL" 

Opublikowano

@Hans Kloss PL Monady są często jedną z tych rzeczy, których zrozumienie zabiera nieco czasu (szczególnie bez doświadczenia z programowaniem funkcyjnym). Najważniejsze dla mnie było to, żeby ludzi nimi zainteresować. Nawet sformułowanie "monads are like burritos" jest żartem na temat blogów o monadach.

https://byorgey.wordpress.com/2009/01/12/abstraction-intuition-and-the-monad-tutorial-fallacy/

708121422388637873334.png

Opublikowano

O wreszcie znalazłem gdzie przeniesiono ten temat :)

Artykuł, który zalinkowałeś jest całkiem spoko - teraz wiadomo o co chodziło w tytule.

Wyczytałem, że monady da się utworzyć także w javascripcie - spróbuje zgłębić temat jak będzie mi się nudzić kiedyś - zawsze to dodatkowy skill bez konieczności nauki kolejnego języka (na co obecnie nie mam czasu).

Czytałem nawet artykuł jakoby jQuery było monadą, aczkolwiek zdania są podzielone (co jeszcze dobitniej pokazuje jak ciężkie jest to do ogarnięcia). W każdym razie dzieki js trochę z funkcyjnych ficzerów korzystałem więc jakiś punkt wyjścia jest.

Chcesz precyzyjnej i zrozumiałej odpowiedzi? - Zadaj precyzyjne i zrozumiałe pytanie. Nie przyjmuję zleceń.
Nie odpowiadam na priv na pytania, które można zadać na forum. Chcesz mojej pomocy - oznacz mnie w poście =>  @"Hans Kloss PL" 

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

×
×
  • Dodaj nową pozycję...