livro texto (cap 11 e 9)
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 )
Maybe são computacoes que pode dar errado
Listas são computacoes que geram 0 , 1 ou mais resultados!!
OI monad são computacoes que fazem I/O
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)
todas computacoes tem acesso a dados comuns imutaveis
cada computacao gera um stream de dados (por exemplo log)
https://en.wikipedia.org/wiki/Call-with-current-continuation
https://wiki.haskell.org/All_About_Monads
proximos passos em haskell https://book.realworldhaskell.org