Haskell - Mônadas

Monadsnada mais são do que um tipo de Função Aplicativa com alguns recursos extras. É uma classe de tipo que governa três regras básicas conhecidas comomonadic rules.

Todas as três regras são estritamente aplicáveis ​​em uma declaração da Mônada, que é a seguinte -

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

As três leis básicas aplicáveis ​​a uma declaração de Mônada são -

  • Left Identity Law - o returna função não altera o valor e não deve alterar nada na Mônada. Pode ser expresso como "return> => mf = mf".

  • Right Identity Law - o returna função não altera o valor e não deve alterar nada na Mônada. Pode ser expresso como "mf> => return = mf".

  • Associativity- De acordo com esta lei, tanto os Functors quanto a instância Monad devem funcionar da mesma maneira. Pode ser expresso matematicamente como "(f> ==> g)> => h = f> => (g> = h)".

As duas primeiras leis repetem o mesmo ponto, ou seja, um return deve ter comportamento de identidade em ambos os lados do bind operador.

Já usamos muitas Mônadas em nossos exemplos anteriores sem perceber que são Mônadas. Considere o exemplo a seguir, em que estamos usando uma Monad de Lista para gerar uma lista específica.

main = do
   print([1..10] >>= (\x -> if odd x then [x*2] else []))

Este código produzirá a seguinte saída -

[2,6,10,14,18]