Haskell - Monady
Monadssą niczym innym jak rodzajem funktorów aplikacyjnych z kilkoma dodatkowymi funkcjami. Jest to klasa typu, która rządzi trzema podstawowymi regułami znanymi jakomonadic rules.
Wszystkie trzy zasady mają ścisłe zastosowanie do deklaracji Monad, która jest następująca:
class Monad m where
return :: a -> m a
(>>=) :: m a -> (a -> m b) -> m b
(>>) :: m a -> m b -> m b
x >> y = x >>= \_ -> y
fail :: String -> m a
fail msg = error msg
Trzy podstawowe prawa, które mają zastosowanie do deklaracji Monad, to:
Left Identity Law - The returnfunkcja nie zmienia wartości i nie powinna niczego zmieniać w Monadzie. Można to wyrazić jako „return> => mf = mf”.
Right Identity Law - The returnfunkcja nie zmienia wartości i nie powinna niczego zmieniać w Monadzie. Można to wyrazić jako „mf> => return = mf”.
Associativity- Zgodnie z tym prawem zarówno instancja Functors, jak i Monad powinny działać w ten sam sposób. Można go matematycznie wyrazić jako „(f> ==> g)> => h = f> => (g> = h)”.
Pierwsze dwa prawa powtarzają ten sam punkt, tj. A return powinny mieć zachowanie tożsamości po obu stronach bind operator.
Użyliśmy już wielu monad w naszych poprzednich przykładach, nie zdając sobie sprawy, że są one monadami. Rozważmy następujący przykład, w którym używamy List Monad do wygenerowania określonej listy.
main = do
print([1..10] >>= (\x -> if odd x then [x*2] else []))
Ten kod wygeneruje następujące dane wyjściowe -
[2,6,10,14,18]