Aula 9 Monads

livro texto (cap 11 e 9)

Haskell - compilado

Exemplo de uso de monads

solquadratica a b c = let
    delta = sqrt (b**2 - 4 *a * c)
    in ((-b + delta) / 2,   (-b - delta) / 2)

agora vamos assumir que a, b e c vem de computacoes que geram maybe, e tambem que para deltas negativos devemos retornar um Nothing

import Data.Maybe 

solquadratica a b c = if isNothing a || isNothing b || isNothing c then Nothing
                      else let
                          aa = fromJust a
                          bb = fromJust b
                          cc = fromJust c
                          delta = (bb**2 - 4 * aa * cc)
                          in if delta < 0 then Nothing
                             else Just ((-bb + sqrt delta)/2, (-bb - sqrt delta)/2)

usando monadas

solquadratica2 a b c = do
                aa <- a
                bb <- b
                cc <- c
                let mysqrt x = if x<0 then Nothing else Just (sqrt x)
                sdelta <- mysqrt (bb**2 - 4 * aa * cc)
                return ( (-bb+sdelta)/2,  (-bb-sdelta)/2 )
                

Outras monadas

state monad

uma aproximacao

simulador g = let (n,g1) = random g
                  (b,g2) = random g1
                  (c,g3) = random g2
                  (m,g4) = random g3
                    in simul' n b c m

voce quer uma monada que contem (valor, estado) e o do cuida para autializar o estado a cada chamada

simuladorx g = do n <- random 
                 b <-  random
                 c <- random 
                 m <- random 
                 return (simul' n b c m)

reader monad

todas computacoes tem acesso a dados comuns imutaveis

writer monad

cada computacao gera um stream de dados (por exemplo log)

call with continuation (??)

https://en.wikipedia.org/wiki/Call-with-current-continuation

referencias futuras

https://wiki.haskell.org/All_About_Monads

proximos passos em haskell https://book.realworldhaskell.org