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]