Haskell aula7 libs_intro_arquivos

16
Programação Funcional em Haskell 7a Reunião —IO, Algumas Bibliotecas

Transcript of Haskell aula7 libs_intro_arquivos

Page 1: Haskell aula7 libs_intro_arquivos

Programação Funcional em Haskell7a Reunião —IO, Algumas Bibliotecas

Page 2: Haskell aula7 libs_intro_arquivos

Conteúdo e objetivos

Introdução à programação funcional usando Haskell Objetivos de aprendizagem

Introdução a Programas Interativos;

Algumas Bibliotecas do Haskell;

Page 3: Haskell aula7 libs_intro_arquivos

Programas InterativosAté agora apenas escrevemos programas que efetuamcomputação pura, i.e., transformações funcionais entre valores.

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

Page 4: Haskell aula7 libs_intro_arquivos

Ações de I/OIntroduzimos um novo tipo IO ()

Encadear açõesPodemos combinar duas ações de I/O usando o operador desequênciação:

Exemplos:putChar ‘X’ :: IO () -- imprime um ’X’putChar ‘Z’ :: IO () -- imprime um ’Y’putChar :: Char -> IO () -- imprimir um carater

(>>) :: IO () -> IO () -> IO ()Exemplos:

(putChar ‘X' >> putChar ‘Z') :: IO () -- imprimir “XZ"(putChar ‘Z' >> putChar ‘X') :: IO () -- imprimir “ZX"

Note que >> é associativo mas não é comutativo!

Page 5: Haskell aula7 libs_intro_arquivos

Encadear ações (cont.)Em alternativa podemos usando a notação-do:

Encadear açõesPodemos omitir os sinais de pontuação usando a indentação:

putChar ‘C' >> putChar ‘R' >> putChar ‘S'

Equivale à:

do {putChar ‘C'; putChar ‘R'; putChar ‘S'}

do putChar ‘C' putChar 'R‘ putChar ‘I‘ putChar ‘S‘

Page 6: Haskell aula7 libs_intro_arquivos

ExecuçãoPara efetuar as ações de I/O definimos um valor main nomódulo Main.

Encadear açõesPodemos omitir os sinais de pontuação usando a indentação:

module Main where

main = do putChar 'A' putChar 'B‘

Compilar e executar:

$ ghc Main.hs -o prog$ ./progAB$

ou$ ghc --make Main.hs prog$ ./prog

Page 7: Haskell aula7 libs_intro_arquivos

Execução (cont).Também podemos efetuar ações IO diretamente no ghci:

Prelude> putChar 'A' >> putChar 'B’ >> putChar ‘\n’ ABPrelude>

Page 8: Haskell aula7 libs_intro_arquivos

Ações IO pré-definidasgetChar :: IO Char -- ler um caracter

getLine :: IO String -- ler uma linha

getContents :: IO String -- ler toda a entrada padrão

putChar :: Char -> IO () -- escrever um caracter

putStr :: String -> IO () -- escrever uma linha de texto

putStrLn :: String -> IO () -- idem com mudança de linha

print :: Show a => a -> IO () -- imprimir um valor

return :: a -> IO a -- ação vazia

Page 9: Haskell aula7 libs_intro_arquivos

Algumas BibliotecasData.List operações sobre listas

Data.Set conjuntos finitos

Data.Map tabelas de associação

Data.Time funções de relógio e tempo

Network.HTTP protocolo de rede HTTP

Page 10: Haskell aula7 libs_intro_arquivos

Data.ListMais funções sobre listas (para além do Prelúdio):

insert :: Ord a => a -> [a] -> [a]delete :: Eq a => a -> [a] -> [a]nub :: Eq a => [a] -> [a]union :: Eq a => [a] -> [a] -> [a]intersect :: Eq a => [a] -> [a] -> [a]sort :: Ord a => [a] -> [a]find :: (a -> Bool) -> [a] -> Maybe a

. . .muitas mais omitidas.

Page 11: Haskell aula7 libs_intro_arquivos

Exemplos Data.List (cont.)> import Data.Char> import Data.List

> insert 3 [1,2,5,7] -- lista ordenada[1,2,3,5,7]> nub "banana""ban"> delete 'a' "banana""bnana"> find isUpper "banana"Nothing> find (>'b') "banana"Just 'n'

Page 12: Haskell aula7 libs_intro_arquivos

Data.Setdata Set a

empty :: Set afromList :: Ord a => [a] -> Set ainsert, delete :: Ord a => a -> Set a -> Set amember :: Ord a => a -> Set a -> Boolsize :: Set a -> Intunion, intersection, difference :: Ord a =>Set a -> Set a -> Set a

. . .muitas outras funções omitidas.

Page 13: Haskell aula7 libs_intro_arquivos

Exemplos Data.Set (cont.)> import Data.Set

> let a = fromList [1,3..20]> let b = fromList [1,5..20]> intersection a bfromList [1,5,9,13,17]> difference a bfromList [3,7,11,15,19]> member 15 (difference a b)True> size (difference a b)5

Page 14: Haskell aula7 libs_intro_arquivos

Network.HTTP & Data.Time-- obter a hora e data atualimport Data.Time

main = do t <- getCurrentTime putStrLn ("Data e hora atual: " ++ show t)

-- buscar uma página HTML como textoimport Network.HTTP

main = do r <- simpleHTTP (getRequest url) html <- getResponseBody r putStrLn html where url = "http://www.haskell.org"

Page 15: Haskell aula7 libs_intro_arquivos

Bibliografia

Haskell - Uma abordagem prática. Cláudio César de Sá eMárcio Ferreira da Silva. Novatec, 2006.

http://haskell.tailorfontela.com.br/

http://www.dcc.fc.up.pt/

http://www.haskell.org/hoogle/

Page 16: Haskell aula7 libs_intro_arquivos

Agradecimentos

Ao Prof°- Ricardo Reis e a todos os participantes do projeto haskell ufc.