Monady i działanie

0

Był by mi ktoś łaskaw wytłumaczyć jak to działa, gdyż już od dłuższego czasu próbuję to zrozumieć a jak na razie z marnym skutkiem. Jak na razie rozumiem monada g >>= f znaczy tyle co f(g()), a monada g >> f tyle co f(); g();. Jednak nie potrafię zrozumieć jak to zastosować i jak to ma działać.

0

IMO powinieneś poszukać jakiegoś artykułu na ten temat albo tutorialu o całym języku bo to na tyle złożone że w jednym poście o sensownej długości ciężko przekazać.

Polecam http://learnyouahaskell.com/chapters (sam kiedyś czytałem) i http://book.realworldhaskell.org/read/ (nie czytałem całego ale jest bardzo dobry).

Monady to pojęcie matematyczne zaciągnięte wprost (niejedyne w haskellu zresztą) z tzw. teorii kategorii. Nie ma to żadnego znaczenia przy pisaniu kodu ale pomyślałem że warto wiedzieć :).

Może najpierw typy:

Prelude> :t (>>=)
(>>=) :: (Monad m) => m a -> (a -> m b) -> m b
Prelude> :t (>>)
(>>) :: (Monad m) => m a -> m b -> m b

Czyli >>= przyjmuje 'opakowaną' w monadę wartość i funkcję przyjmującą zwykłą wartość i pakującą ją w monadę i zwraca wartość opakowaną. Prościej to zresztą odczytać z typu niż tego zawiłego zdania. Co z tego wynika - najprostszy przykład monady to Maybe (chyba ulubiony przykład wszystkich twórców tutoriali bo wszędzie się z nim spotyka)
Przykład takiej operacji:

Prelude> Just 2 >>= (\x -> Just (x + 1))
Just 3

Lambda przyjmuje x i zwraca Just (x + 1).

jest bardzo podobny, tylko że... ignoruje pierwszy parametr. Przykład:

Prelude> Just 2 >> Just 3
Just 3

No i to jest w sumie tyle teorii, czyli chyba odpowiedziałem na pytanie - w sumie prawie to samo co interpretacja jako C++-like funkcje. Gorzej z praktyką, bo ciężko dostrzec do czego to coś może być w ogóle przydatne. Dzięki monadom w Haskellu można na przykład oszukać funkcyjność i pisać w sposób czysty kod mający pozornie efekty uboczne (na przykład IO).

Opisanie możliwości tego jest za trudne dla mnie, czym się nie przejmuje bo dziesiątki kursów starają się tłumaczyć monady w sposób przystępny i prawie nikomu się nie udaje. Dlatego polecam chociaż przejrzenie http://learnyouahaskell.com/a-fistful-of-monads i http://learnyouahaskell.com/for-a-few-monads-more (a najlepiej wcześniej jako 'łagodne wprowadzenie' http://learnyouahaskell.com/functors-applicative-functors-and-monoids).

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