Programação Funcional. Capítulo 13. Mônadas. José Romildo Malaquias. Departamento de Computação Universidade Federal de Ouro Preto 2012.

Documentos relacionados
Programação Funcional. Capítulo 13. Mônadas. José Romildo Malaquias. Departamento de Computação Universidade Federal de Ouro Preto 2013.

Programas Interativos

Programação Funcional. Aula 7. Entrada e Saída. José Romildo Malaquias. Departamento de Computação Universidade Federal de Ouro Preto /86 ...

Programas Interativos

Programação Funcional. Capítulo 21. Parsers. José Romildo Malaquias. Departamento de Computação Universidade Federal de Ouro Preto 2018.

Programação Funcional 9 a Aula Programas interativos

Tipos Algébricos. Programação Funcional. Capítulo 11. José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto

Simulação de Caixa Automático

Programação Funcional. Aula 10. Parsers. José Romildo Malaquias. Departamento de Computação Universidade Federal de Ouro Preto /74 ...

Linguagens de Programação. Programação Funcional e Haskell Programação Interativa Thiago Alves

Expressão Condicional

Programas Interativos

Casamento de Padrão. Programação Funcional. Capítulo 5. José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto

Programação Funcional Aulas 9, 10 & 11

Casamento de Padrão. Programação Funcional. Capítulo 6. José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto

Expressões Condicionais

Programação Funcional BCC222. Aulas 17,18. IO e Mônadas

Números Aleatórios Argumentos da Linha de Comando Arquivos

Layout. Módulos. Normalmente, cada módulo está armazenado num ficheiro com o mesmo nome do módulo. Exemplo.hs

Expressões Condicionais

Funções de Ordem Superior

Programação Funcional 14 a Aula Classes de tipos revisitadas

Pedro Vasconcelos DCC/FCUP. Programação Funcional 13 a Aula Definição de tipos

Entrada e Saída de Dados

Entrada e Saída em Haskell Tutorial

A classe Read. Read. Hierarquia de classes pré-definidas do Haskell. Declaração de tipos polimórficos com restrições nos parâmetros

Funções de Ordem Superior

3. Linguagem de Programação C

PROGRAMAÇÃO FUNCIONAL [BCC222] 1 Jogo Adivinha o Número. Teste 4 (2018 1) 23 de maio de 2018 Matrícula: Nome:

Programação Funcional em Haskell

Layout. Módulos. Normalmente, cada módulo está armazenado num ficheiro com o mesmo nome do módulo. Exemplo.hs

Paradigmas de Programação

Linguagens de Programação. Programação Funcional e Haskell Declarando Tipos Thiago Alves

Variáveis primitivas e Controle de fluxo

Tipos de Dados Algébricos

Programação de Computadores I Introdução ao C PROFESSORA CINTIA CAETANO

Linguagem de Programação C

Aula prática 5. Funções Recursivas

4.2. CLASSES Versão

Introdução ao Fortran 90-1

Conceitos de Linguagem de Programação - 2

Linguagem C: Introdução

Programação Funcional

Pedro Vasconcelos DCC/FCUP. Programação Funcional 4 a Aula Listas

Tipos Abstractos de Dados. Tipos Abstractos de Dados. Stacks (pilhas)

Métodos Computacionais. Operadores, Expressões Aritméticas e Entrada/Saída de Dados

Pedro Vasconcelos DCC/FCUP. Programação Funcional 3 a Aula Definição de funções

Ambiente de desenvolvimento

Aula Prática 3. Paradigmas da Programação I / Programação Funcional. ESI/MCC 1 o ano (2005/2006)

Seleção Múltipla Laços (while, do-while, for) AULA 05

Programas Interativos: Valores Aleatórios

3. Linguagem de Programação C

Paradigmas de Programação

Expressões Lambda. Programação Funcional. Capítulo 7. José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto

Listas em Haskell. Listas. Linguagem Haskell. Maria Adriana Vidigal de Lima. Faculdade de Computação - UFU. Setembro

Computação Eletrônica. Tipos de dados, constantes, variáveis, operadores e expressões. Prof: Luciano Barbosa

Interpretação e Compilação de Linguagens de Programação Semântica CALCI com Ambiente

ICMC USP. 1.semestre/2011 SCC120 - ICC. Aula: Comandos em C. Profa. Roseli Ap. Francelin Romero

Haskell Paralelo (e entrada e saída de dados)

LINGUAGEM C: COMANDOS DE CONTROLE CONDICIONAL

Linguagens de Domínio Específico

Linguagem C. André Tavares da Silva.

PROGRAMAÇÃO de COMPUTADORES: LINGUAGEM FORTRAN 90/95

Computação Eletrônica

Universidade Estadual da Paraíba - UEPB Curso de Licenciatura em Computação

Estrutura de um Algoritmo, Variáveis, Comandos de Entrada e Saída e Expressões Aritméticas

Testes em Haskell com a framework HUnit 1.0

Linguagens de Programação Aula 14

Conhecendo a Linguagem de Programação C

4.1- Aritméticos + soma - subtração * multiplicação / divisão % módulo (resto da divisão de inteiros ).

Algoritmos e Estruturas de Dados I (DCC/003) Estruturas Básicas. Aula Tópico 2

Representação da Informação no Computador

Programação Funcional. Capítulo 2. Primeiros Passos. José Romildo Malaquias. Departamento de Computação Universidade Federal de Ouro Preto 2013.

Professor: Domingos Equipe Haskell: Lucas Montesuma, Francisco Leonardo CONCEITOS DA LINGUAGEM DE PROGRAMAÇÃO CÁLCULADORA EM HASKELL

Linguagens de Programação Aula 13

Algoritmos: Conceitos Fundamentais

Introdução à Programação. Expressões Booleanas e Comandos Condicionais

Aula prática 2. Definindo Funções. Resumo Vamos aprender nesta aula a fazer nossas primeiras definições de função. 1 Scripts 1.

Introdução a Programação de Jogos

Algoritmos e Programação

Sistemas Operacionais e Introdução à Programação. Programação com linguagem C

Análise de Programação

Introdução à Ciência da Computação

Comandos em C (cont.)

Introdução à Programação. Operadores, Expressões Aritméticas e Entrada/Saída de Dados

Programação Funcional. Aula 4. Definindo Funções. José Romildo Malaquias. Departamento de Computação Universidade Federal de Ouro Preto 2011.

3. Linguagem de Programação C

ponteiros INF Programação I Prof. Roberto Azevedo

Sub-rotinas em C. Disciplina de Programação de Computadores I Universidade Federal de Ouro Preto

Programação Funcional BCC222. Aulas 5,6. Mais sobre recursão

Linguagens de Programação

Introdução à Computação

Tratamento de Exceções. LPG II Java. Tratamento de Exceções. Conceito de Exceções. Exemplo

Conceitos de Linguagens de Programação

Tipo de argumentos. valor. argumentos

Introdução à Computação

Introdução à Programação uma Abordagem Funcional

Lição 4 Fundamentos da programação

3. Linguagem de Programação C

Transcrição:

Programação Funcional Capítulo 13 Mônadas José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto 2012.1 1/31

1 Mônadas 2 Entrada e saída 3 Expressão do 4 Computações que podem falhar 5 Expressões aritméticas 2/31

Tópicos 1 Mônadas 2 Entrada e saída 3 Expressão do 4 Computações que podem falhar 5 Expressões aritméticas 3/31

Mônadas Mônadas em Haskell podem ser pensadas como descrições de computação combináveis. Cada mônada representa um tipo diferente de computação. Uma mônada pode ser executada a fim de realizar a computação por ela representada e produzir um valor como resultado. 4/31

Operações monádicas básicas (>>=) Usado para realizar duas computações em sequência. Combina duas computações de forma que, quando a computação combinada é executada, a primeira computação é executada o seu resultado é passado para a segunda computação, que então é executada usando (ou dependendo de) aquele valor. return return x é uma computação que, quando executada, apenas produz o resultado x. 5/31

A classe Monad Uma mônada pode ser declarada como uma classe em Haskell: class Monad m where return :: a -> m a (>>=) :: m a -> (a -> m b) -> m b (>>) :: m a -> m b -> m b fail :: String -> m a p >> q = p >>= \_ -> q fail msg = error msg Nesta classe de tipo a variável restrita m representa um construtor de tipo (de aridade um), e não um tipo! Um construtor de tipo é uma mônada se existirem as operações return e (>>=) que permitem combinar valores do tipo em sequência. 6/31

Leis das mônadas Além de implementar as funções da classe Monad, todas as mônadas devem obedecer as seguintes leis, dadas pelas equações: return a >>= k = k a m >>= return = m m >>= (\x -> k x >>= h) = (m >>= k) >>= h 7/31

Tópicos 1 Mônadas 2 Entrada e saída 3 Expressão do 4 Computações que podem falhar 5 Expressões aritméticas 8/31

Entrada e saída Uma ação de entrada e saída é representada pelo tipo IO a. IO a é um tipo abstrato em que pelo menos as seguintes operações estão disponíveis: Operações primitivas, como por exemplo: putchar :: Char -> IO () getchar :: IO Char Operações para combinar ações de entrada e saída: return :: a -> IO a return x é uma ação de E/S que quando executada não interage com o mundo e retorna x. (>>=) :: IO a -> (a -> IO b) -> IO b p >>= q é uma ação de E/S que quando executada, executa primeira a ação p e em seguida aplica a função q no resultado de p. O corpo da função q é a segunda ação da sequência. O resultado da primeira ação pode ser usado na segunda ação porque ele é passado como argumento para a função q. 9/31

Entrada e saída (cont.) As funções return e (>>=) caracterizam a classe de tipos chamada mônada. As demais funções primitivas são específicas de ações de entrada e saída. Assim IO é uma mônada e x :: IO a é uma ação monádica. 10/31

Tópicos 1 Mônadas 2 Entrada e saída 3 Expressão do 4 Computações que podem falhar 5 Expressões aritméticas 11/31

Notação do Tipicamente computações são construídas a partir de longos encadeamentos dos operadores (>>) e (>>=). Haskell oferece a expressão do, que permite combinar várias computações a serem executadas em sequência usando uma notação mais conveniente. Uma expressão do é uma extensão sintática do Haskell e sempre pode ser reescrita como uma expressão mais básica usando os operadores de sequenciamento (>>) e (>>=) e a expressão let. 12/31

Exemplo de notação do Um programa para ler dois números e exibir a sua soma: module Main (main) where import System.IO ( stdout, hsetbuffering, BufferMode(NoBuffering) ) main :: IO () main = do { hsetbuffering stdout NoBuffering; putstr "Digite um número: "; s1 <- getline; putstr "Digite outro número: "; s2 <- getline; putstr "Soma: "; putstrln (show (read s1 + read s2)) } 13/31

Regra de layout com a notação do A expressão do pode usar layout em sua estrutura sintática, de maneira semelhate à expressão let e às cláusulas where. As regras de layout, por meior do uso de indentação adequada, permitem omitir as chaves { e } usadas para delimitar o corpo da expressão do e os pontos-e-vírgula ; usados para separar as ações que compõem o seu corpo. Neste caso todas as ações devem começar na mesma coluna, e se continuarem nas linhas seguintes, não podem usar colunas menores que esta coluna. 14/31

Exemplo de notação do usando layout Um programa para ler dois números e exibir a sua soma: module Main (main) where import System.IO ( stdout, hsetbuffering, BufferMode(NoBuffering) ) main :: IO () main = do hsetbuffering stdout NoBuffering putstr "Digite um número: " s1 <- getline putstr "Digite outro número: " s2 <- getline putstr "Soma: " putstrln (show (read s1 + read s2)) 15/31

Tradução da expressão do Código escrito usando a notação do é transformado automaticamente pelo compilador em expressões ordinárias que usam as funções (>>=) e (>>) da classe Monad, e a expressão let. 16/31

Tradução da expressão do (cont.) Quando houver uma única ação no corpo: do { ação } ação Exemplo: do putstrln "Bom dia, galera!" putstrln "Bom dia, galera!" Observe que neste caso não é permitido usar a forma padrão <- ação pois não há outras ações que poderiam usar variáveis instanciadas pelo casamento de padrão. 17/31

Tradução da expressão do (cont.) Quando houver duas ou mais ações sem casamento de padrão na primeira ação: do { ação ; resto } ação >> do { resto } Exemplo: do putstrln "um" ; putstrln "dois" putstrln "um" >> do putstrln "dois" putstrln "um" >> putstrln "dois" 18/31

Tradução da expressão do (cont.) Quando houver duas ou mais ações com casamento de padrão na primeira ação: do { padrão <- ação ; resto } ação >>= \padrão -> do { resto } Exemplo: do x <- getline ; putstrln ("Você digitou: " ++ x) getline >>= \x -> do putstrln ("Você digitou: " ++ x) getline >>= \x -> putstrln ("Você digitou: " ++ x) 19/31

Tradução da expressão do (cont.) Quando houver duas ou mais ações com declaração local na primeira ação: do { let declarações ; resto } let declarações in do { resto } Exemplo: do let f xs = xs ++ xs ; putstrln (f "abc") let f xs = xs ++ xs in do putstrln (f "abc") let f xs = xs ++ xs in putstrln (f "abc") 20/31

Tópicos 1 Mônadas 2 Entrada e saída 3 Expressão do 4 Computações que podem falhar 5 Expressões aritméticas 21/31

Computações que podem falhar A mônada Maybe representa computações que podem falhar. Declaração: data Maybe a = Nothing Just a instance Monad Maybe where return = Just Nothing >>= f = Nothing Just x >>= f = f x 22/31

Computações que podem falhar (cont.) Exemplo: agenda telefônica agenda :: [(String,String)] agenda = [ ("Bob", "01788 665242"), ("Fred", "01624 556442"), ("Alice", "01889 985333"), ("Jane", "01732 187565") ] lookup :: Eq a => a -> [(a,b)] -> Maybe b lookup x [] lookup x ((y,v):ys) x == y = Nothing = Just v otherwise = lookup x ys Queremos procurar dois itens na agenda: se algum dos itens não for encontrado, a operação falha se ambos os itens forem encontrados, resulta no par formado pelos valores correspondentes lookup2 :: String -> String -> Maybe (String,String) 23/31

Computações que podem falhar (cont.) Inspecionando diretamente a estrutura de dados: lookup2 a b = case lookup a agenda of Nothing -> Nothing Just x -> case lookup b agenda of Nothing -> Nothing Just y -> Just (x,y) Usando operações monádicas sem a notação do: lookup2 a b = lookup a agenda >>= \x -> lookup b agenda >>= \y -> return (x,y) Usando operações monádicas com a notação do: lookup2 a b = do x <- lookup a agenda y <- lookup b agenda return (x,y) 24/31

Tópicos 1 Mônadas 2 Entrada e saída 3 Expressão do 4 Computações que podem falhar 5 Expressões aritméticas 25/31

Expressões aritméticas Considere o tipo Exp que representa uma expressão aritmética: data Exp = Cte Integer Som Exp Exp Sub Exp Exp Mul Exp Exp Div Exp Exp deriving (Read, Show) Uma expressão aritmética é: uma constante inteira, ou a soma de duas expressões, ou a diferença de duas expressões, ou o produto de duas expressões, ou o quociente de duas expressões. 26/31

Exemplos de expressões aritméticas -- 73/(3+3) * 8 expok = Mul (Div (Cte 73) (Som (Cte 3) (Cte 3))) (Cte 8) -- 73/(3-3) * 8 expproblema = Mul (Div (Cte 73) (Sub (Cte 3) (Cte 3))) (Cte 8) 27/31

Avaliação de expressões aritméticas Um avaliador simples de expressões aritméticas: avalia :: Exp -> Integer avalia (Cte x) = x avalia (Som a b) = avalia a + avalia b avalia (Sub a b) = avalia a - avalia b avalia (Mul a b) = avalia a * avalia b avalia (Div a b) = div (avalia a) (avalia b) 28/31

Avaliação de expressões aritméticas (cont.) Avaliando as expressões anteriores: *Main> avalia expok 96 *Main> avalia expproblema *** Exception: divide by zero A segunda expressão não pode ser avaliada, pois a divisão por zero leva a um resultado indefinido. 29/31

Exercícios Exercício 1 Redefina a função avalia para que ela não produza uma exceção quando em sua estrutura houver divisão por zero. A função deve retornar uma indicação de falha ou sucesso juntamente com o seu valor em caso de sucesso. Inspecione os resultados das avaliações das subexpressões diretamente usando análise de casos. Exercício 2 Modifique a função avalia do exercício anterior para usar operações monádicas ao invés de inspecionar os resultados das avaliações das subexpressões diretamente usando análise de casos. Não use a notação do. Exercício 3 Modifique a função avalia do exercício anterior para usar a notação do para realizar as operações monádicas. 30/31

Fim 31/31