Buscar

Programação Funcional - Haskell - Monadas Maybe - Wladimir Araújo Tavares UFC-Quixadá

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você viu 3, do total de 13 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você viu 6, do total de 13 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você viu 9, do total de 13 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Prévia do material em texto

Moˆnadas
Wladimir Arau´jo Tavares 1
1Universidade Federal do Ceara´ - Campus de Quixada´
3 de maio de 2015
Wladimir Arau´jo Tavares (UFC) Moˆnadas 3 de maio de 2015 1 / 13
Moˆnadas
Cada Moˆnada representa um tipo diferente de computac¸a˜o.
Moˆnadas proveˆ um mecanismo para simular efeitos como estado
global, tratamento de execec¸o˜es ou na˜o-determinismo.
Wladimir Arau´jo Tavares (UFC) Moˆnadas 3 de maio de 2015 2 / 13
Exemplo
Considere o seguinte programa:
data Term = Const I n t | Div Term Term
t1 = Div ( Const 4) ( Const 0)
e v a l : : Term −> I n t
e v a l ( Const a ) = a
e v a l ( Div t u ) = d i v ( e v a l t ) ( e v a l u )
A avaliac¸a˜o eval t1 gera uma exception: divide by zero.
Wladimir Arau´jo Tavares (UFC) Moˆnadas 3 de maio de 2015 3 / 13
Computac¸o˜es que podem falhar
data M a = Falha | Return a d e r i v i n g (Show)
e v a l 2 : : Term −> M I n t
e v a l 2 ( Const a ) = Return a
e v a l 2 ( Div t u ) = case e v a l 2 t of
Fa lha −> Fa lha
Return a −>
case e v a l 2 u of
Fa lha −> Fa lha
Return b −>
i f b == 0 then Fa lha e l s e Return ( d i v a b )
Wladimir Arau´jo Tavares (UFC) Moˆnadas 3 de maio de 2015 4 / 13
Operador Bind
( b ind ) : : M a −> ( a −> M b) −> M b
( b ind ) Fa lha f = Fa lha
( b ind ) ( Return x ) f = f x
bind: e´ usado para realizar duas computac¸o˜es em sequeˆncia. Combina
duas computac¸o˜es de forma que, quando a computac¸a˜o combinada e´
executada, a primeira computac¸a˜o e´ executada o seu resultado e´ passado
para a segunda computac¸a˜o, que enta˜o e´ executada usando (ou
dependendo de) aquele valor.
Wladimir Arau´jo Tavares (UFC) Moˆnadas 3 de maio de 2015 5 / 13
Operador Bind
e v a l 3 ( Const a ) = Return a
e v a l 3 ( Div t u ) = ( b ind ) ( e v a l 3 t ) (\ x −> ( ( b ind ) ( e v a l 3 u )
(\ y −> ( i f y == 0 then Fa lha e l s e Return ( d i v x y ) ) ) )
)
Wladimir Arau´jo Tavares (UFC) Moˆnadas 3 de maio de 2015 6 / 13
Classe Moˆnadas
Uma moˆnada pode ser declarada como uma classe em Haskell:
c l a s s Monad m where
r e t u r n : : a −> m a
(>>=) : : m a −> ( a −> m b) −> m b
Wladimir Arau´jo Tavares (UFC) Moˆnadas 3 de maio de 2015 7 / 13
Moˆnada M
i n s t a n c e Monad M where
r e t u r n a = Return a
m >>= f = case m of
Fa lha −> Fa lha
Return a −> f a
e v a l 4 ( Const a ) = Return a
e v a l 4 ( Div t u ) = ( e v a l 4 t ) >>= (\ x −> ( ( e v a l 4 u ) >>= (\ y −>
( i f y == 0 then Fa lha e l s e Return ( d i v x y ) ) ) ) )
Wladimir Arau´jo Tavares (UFC) Moˆnadas 3 de maio de 2015 8 / 13
Notac¸a˜o do
i n s t a n c e Monad M where
r e t u r n a = Return a
m >>= f = case m of
Fa lha −> Fa lha
Return a −> f a
e v a l 5 ( Const a ) = Return a
e v a l 5 ( Div t u ) = do {
x <− e v a l 5 t ;
y <− e v a l 5 u ;
i f y ==0 then Fa lha e l s e Return ( d i v x y )
}
Wladimir Arau´jo Tavares (UFC) Moˆnadas 3 de maio de 2015 9 / 13
Exerc´ıcio 1
A func¸a˜o log :: Floating a => a -> a na˜o esta´ definida para
nu´meros negativos.
> l og 1000
6.907755278982137
> l og (−1000)
ERROR
Defina uma versa˜o segura que evite runtime error usando Maybe.
sa f eLog : : ( F l o a t i n g a , Ord a ) => a −> Maybe a
sa f eLog x
| x > 0 =
| otherwise =
sa f eLog x
| x > 0 = Just ( l og x )
| otherwise = Nothing
Wladimir Arau´jo Tavares (UFC) Moˆnadas 3 de maio de 2015 10 / 13
Exerc´ıcio 2
A func¸a˜o sqrt :: Floating a => a -> a na˜o esta´ definida para
nu´meros negativos. Defina uma versa˜o segura evitando erros usando
Maybe.
s a f e S q r t x
| x > 0 = Just ( s q r t x )
| otherwise = Nothing
Wladimir Arau´jo Tavares (UFC) Moˆnadas 3 de maio de 2015 11 / 13
Exerc´ıcio 3
Fac¸a a versa˜o segura da func¸a˜o composta log ◦ sqrt(x) = log(sqrt(x))
usando com a notac¸a˜o do.
s a f eLogSq r t : : ( F l o a t i n g a , Ord a ) => a −> Maybe a
s a f eLogSq r t x = do {
}
s a f eLogSq r t : : ( F l o a t i n g a , Ord a ) => a −> Maybe a
s a f eLogSq r t x = do {
y <− s a f e S q r t x ;
z <− sa f eLog y ;
r e t u r n z ;
}
Wladimir Arau´jo Tavares (UFC) Moˆnadas 3 de maio de 2015 12 / 13
Exerc´ıcio 4
Fac¸a a versa˜o segura da func¸a˜o composta log ◦ sqrt(x) = log(sqrt(x))
usando >>=.
s a f eLogSq r t : : ( F l o a t i n g a , Ord a ) => a −> Maybe a
s a f eLogSq r t x = do {
}
s a f eLogSq r t : : ( F l o a t i n g a , Ord a ) => a −> Maybe a
s a f eLogSq r t x = s a f e S q r t x >>= sa f eLog >>= r e t u r n
Wladimir Arau´jo Tavares (UFC) Moˆnadas 3 de maio de 2015 13 / 13

Outros materiais