Programação Funcional 9 a Aula Programas interativos

Documentos relacionados
Programação Funcional Aulas 9, 10 & 11

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

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

Entrada e Saída de Dados

Programas Interativos

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

Programas Interativos

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

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

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

Programas Interativos

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

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

Entrada e Saída em Haskell Tutorial

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

Expressões Condicionais

Expressões Condicionais

Simulação de Caixa Automático

Aula Prática 2. Paradigmas da Programação I / Programação Funcional

Introdução à Programação em C Input / Output

Paradigmas de Programação

Pedro Vasconcelos DCC/FCUP. Programação Funcional 5 a Aula Definições recursivas

Funções de Entrada e Saída

3.1 - Funções para manipular dados de entrada e saída padrão

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

Expressão Condicional

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

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

Linguagem C. André Tavares da Silva.

Algoritmos e Estruturas de Dados I (DCC/003) Funções

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

Material sobre Funções AEDS 1

Introdução à Programação Aula 3 Primeiros programas

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

Programação Funcional Aulas 5 & 6

Pedro Vasconcelos DCC/FCUP. Programação Funcional 19 a Aula Raciocinar sobre programas

Pedro Vasconcelos DCC/FCUP. Programação Funcional 18 a Aula Plataforma Haskell

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

Programação I Aula 3 Primeiros programas

3. Linguagem de Programação C

MC-102 Aula 04 Expressões Relacionais, Lógicas e Comandos Condicionais

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

Aula 3:Introdução à Linguagem C

Introdução à Programação Aula 5 Ciclos e condicionais

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

Introdução à linguagem de programação C. Alexandre Mota

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

Programação Funcional

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

Introdução à Programação em C (II)

Programação I Aula 11 Mais sobre ciclos e iteração

Programação I Aula 6 Números pseudo-aleatórios

Funções de Ordem Superior

Pedro Vasconcelos DCC/FCUP. Programação Funcional 14 a Aula Um verificador de tautologia

Entrada e saída. Marco A L Barbosa malbarbo.pro.br. Departamento de Informática Universidade Estadual de Maringá

Introdução à Programação / Programação I

Linguagens de Programação Aula 14

Pedro Vasconcelos DCC/FCUP. Programação Funcional 2 a Aula Tipos e classes

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

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

Programação Funcional

Programação Funcional em Haskell

Conceitos de Linguagens de Programação

Introdução a Programação. Strings (Vetor de Caracteres)

Pedro Vasconcelos DCC/FCUP. Programação Funcional 2 a Aula Tipos e classes

Variáveis e Entrada de Dados Marco André Lopes Mendes marcoandre.googlepages.

Aula 3 Constantes e funções de E/S

Linguagens de Programação

Aula prática 14. Expressão Lambda

PROGRAMAÇÃO I A LINGUAGEM DE PROGRAMAÇÃO JAVA II

Vetores em Haskell. Vetores e Matrizes. Linguagem Haskell. Maria Adriana Vidigal de Lima. Faculdade de Computação - UFU.

PROGRAMAÇÃO DE MICROPROCESSADORES 2007 / 2008

Pedro Vasconcelos DCC/FCUP. Programação Funcional 7 a Aula Funções de ordem superior

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

INSTITUTO FEDERAL DE! EDUCAÇÃO, CIÊNCIA E TECNOLOGIA RIO GRANDE DO NORTE

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

Funções de Ordem Superior

Aula 9: Shell Script

Computação para Informática - Prof. Adriano Joaquim de Oliveira Cruz Segunda Aula Prática - 29 de agosto de 2008

Leitura Segura de Strings

Introdução à Programação (CC111)

LÓGICA DE PROGRAMAÇÃO ESTRUTURAS DE DECISÃO PARA ENGENHARIA. Prof. Dr. Daniel Caetano

Algoritmos e Estruturas de Dados I. Funções. Pedro Olmo Stancioli Vaz de Melo

Computação L2. Linguagem C++ Observação: Material Baseado na Disciplina Computação Eletrônica.

Introdução à Ciência da Computação scc-120

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

Aula 5 e 6: Introdução ao shell

Programação I Aula 12 Mais sobre cadeias e listas

Algoritmos e Programação

Computação 1 - Python Aula 3 - Teórica: Tipos de dados, Strings, Estrutura Condicional 1/ 28

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

Linguagem C Entrada/Saída (console)

Processamento da Informação Teoria Funções

Universidade Federal de Uberlândia Faculdade de Computação. Linguagem C: funções

FUNDAMENTOS DA PROGRAMAÇÃO 1º Teste, 19 de abril de 2013, 1h30m

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

Introdução a C. Para saber quais os procedimento ou funções que existem em cada biblioteca, acesse

Métodos Computacionais. Strings (Vetor de Caracteres)

Testes em Haskell com a framework HUnit 1.0

Transcrição:

Programação Funcional 9 a Aula Programas interativos Pedro Vasconcelos DCC/FCUP 2014

Motivação Até agora apenas escrevemos programas que efetuam computação pura, i.e., transformações funcionais entre valores.

Motivação (cont.) Vamos agora ver como escrever programas interativos: lêm informação do teclado, ficheiros, etc.; escrevem no terminal ou em ficheiros;...

Ações de I/O Introduzimos um novo tipo IO () para ações que, se forem executadas, fazem entrada/saída de dados. Exemplos: putchar 'A' :: IO () putchar 'B' :: IO () putchar :: Char -> IO () -- imprime um A -- imprime um B -- imprimir um carater

Encadear ações Podemos combinar duas ações de I/O usando o operador de sequênciação: (>>) :: IO () -> IO () -> IO () Exemplos: (putchar 'A' >> putchar 'B') :: IO () (putchar 'B' >> putchar 'A') :: IO () -- imprimir "AB" -- imprimir "BA" Note que >> é associativo mas não é comutativo!

Encadear ações (cont.) Em alternativa podemos usando a notação-do: = putchar 'A' >> putchar 'B' >> putchar 'C' do {putchar 'A'; putchar 'B'; putchar 'C'} Podemos omitir os sinais de pontuação usando a indentação: do putchar 'A' putchar 'B' putchar 'C'

Execução Para efetuar as ações de I/O definimos um valor main no módulo Main. module Main where main = do putchar 'A' putchar 'B' Compilar e executar: $ ghc Main.hs -o prog $./prog AB$

Execução (cont.) Também podemos efetuar ações IO diretamente no ghci: Prelude> putchar 'A' >> putchar 'B' ABPrelude>

Definir novas ações Vamos agora definir novas ações de I/O combinando ações mais simples. Exemplo: definir putstr usando putchar recursivamente. putstr :: String -> IO () putstr [] =?? putstr (x:xs) = putchar x >> putstr xs Como completar?

Ação vazia putstr :: String -> IO () putstr [] = return () putstr (x:xs) = putchar x >> putstr xs return () é a ação vazia: se for efetuada, não faz nada.

Mais geralmente IO a é o tipo de ações que, se forem executadas, fazem entrada/saída de dados e devolvem um valor de tipo a. Exemplos: putchar 'A' :: IO () getchar :: IO Char -- escrever um A ; resultado vazio -- ler um caracter; resultado Char

Ações IO pré-definidas getchar :: IO Char getline :: IO String getcontents :: IO String putchar :: Char -> IO () putstr :: String -> IO () putstrln :: String -> IO () -- ler um caracter -- ler uma linha -- ler toda a entrada padrão -- escrever um carater -- escrever uma linha de texto -- idem com mudança de linha print :: Show a => a -> IO () return :: a -> IO a -- imprimir um valor -- ação vazia

Combinando leitura e escrita Usamos <- para obter valores retornados por uma ação I/O. Exemplo: ler e imprimir caracteres até obter um fim-de-linha. main :: IO () main = do x<-getchar putchar x if x=='\n' then return () else main

Combinando leitura e escrita (cont.) Outro exemplo: boasvindas :: IO () boasvindas = do putstr "Como te chamas? " nome <- getline putstr ("Bem-vindo, " ++ nome ++ "!\n")

Valores de retorno Podemos usar return para definir valores de retorno de ações. boasvindas :: IO String boasvindas = do putstr "Como te chamas? " nome <- getline putstr ("Bem-vindo, " ++ nome ++ "!\n") return nome

Valores de retorno (cont.) Outro exemplo: definir getline usando getchar. getline :: IO String getline = do x<-getchar if x=='\n' then return [] else do xs<-getline return (x:xs)

Jogo Hi-Lo Exemplo maior: um jogo de perguntas-respostas. o computador escolhe um número secreto entre 1 e 100; o jogador vai fazer tentativas de advinhar; para cada tentativa o computador diz se é alto ou baixo; a pontuação final é o número de tentativas.

Jogo Hi-Lo (cont.) Tentativa? 50 Demasiado alto! Tentativa? 25 Demasiado baixo! Tentativa? 35 Demasiado alto! Tentativa? 30 Demasiado baixo! Tentativa? 32 Acertou em 5 tentativas.

Jogo Hi-Lo (cont.) Vamos decompor em duas partes: main escolhe o número secreto e inicia o jogo; jogo função recursiva que efetua a sequência perguntas-respostas.

Programa module Main where import Data.Char(isDigit) import System.Random(randomRIO) main = do x <- randomrio (1,100) -- escolher número aletório n <- jogo 1 x -- começar o jogo putstrln ("Acertou em " ++ show n ++ " tentativas")

Programa (cont.) jogo :: Int -> Int -> IO Int jogo n x -- n: tentativas, x: número secreto = do { putstr "Tentativa? " ; str <- getline ; if all isdigit str then let y = read str in if y>x then do putstrln "Demasiado alto!"; jogo (n+1) x else if y<x then do putstrln "Demasiado baixo!"; jogo (n+1) x else return n else do putstrln "Tentativa inválida!"; jogo n x }

Ações são valores As ações IO são valores de primeira classe: podem ser argumentos ou resultados de funções; podem passados em listas ou tuplos;... Isto permite muita flexibilidade ao combinar ações.

Ações são valores (cont.) Exemplo: uma função para efetuar uma lista de ações por ordem. seqn :: [IO a] -> IO () seqn [] = return () seqn (m:ms) = m >> seqn ms

Ações são valores (cont.) Exemplos de uso: > seqn [putstrln s s<-["ola", "mundo"]] ola mundo > seqn [print i i<-[1..5]] 1 2 3 4 5

Sumário Programas reais necessitam de combinar interação e computação pura Em Haskell fica explícito nos tipos quais as funções que fazem interação e quais são puras. A notação-do e o tipo IO é usada para: ler e escrever no terminal e em ficheiros; estabelecer comunicações de rede; serviços do sistema operativo (ex: obter data e hora do relógio de sistema); bibliotecas escritas em outras linguagens (ex: C/C++).