Baixe o app para aproveitar ainda mais
Prévia do material em texto
IO na Linguagem Funcional Haskell Universidade de Bras´ılia Rodrigo Bonifa´cio 25 de abril de 2013 Rodrigo Bonifa´cio IO na Linguagem Funcional Haskell Esses slides correspondem a uma traduc¸a˜o/adaptac¸a˜o do material elaborado pelo Prof. Ralf Laemmel. Rodrigo Bonifa´cio IO na Linguagem Funcional Haskell Programac¸a˜o em Batch Ate´ agora, vimos como Haskell pode ser usada para executar batch programs, que recebem todas as entradas no in´ıcio da execuc¸a˜o e disponibiliza todos os resultados quando o programa termina. Lembrar que um programa Haskell e´ uma func¸a˜o. By Ralf Laemmel Rodrigo Bonifa´cio IO na Linguagem Funcional Haskell Programac¸a˜o em Batch Ate´ agora, vimos como Haskell pode ser usada para executar batch programs, que recebem todas as entradas no in´ıcio da execuc¸a˜o e disponibiliza todos os resultados quando o programa termina. Lembrar que um programa Haskell e´ uma func¸a˜o. By Ralf Laemmel Rodrigo Bonifa´cio IO na Linguagem Funcional Haskell Programac¸a˜o em Batch Ate´ agora, vimos como Haskell pode ser usada para executar batch programs, que recebem todas as entradas no in´ıcio da execuc¸a˜o e disponibiliza todos os resultados quando o programa termina. Lembrar que um programa Haskell e´ uma func¸a˜o. By Ralf Laemmel Rodrigo Bonifa´cio IO na Linguagem Funcional Haskell Programas interativos By Ralf Laemmel Os resultados na˜o dependem exclusivamente dos argumentos passados a`s func¸o˜es. Ou seja, sistemas interativos exibem efeitos colaterais, o que dificulta o racioc´ınio sobre programas e impede a realizac¸a˜o de alguns tipos de otimizac¸a˜o. Rodrigo Bonifa´cio IO na Linguagem Funcional Haskell Programas interativos By Ralf Laemmel Os resultados na˜o dependem exclusivamente dos argumentos passados a`s func¸o˜es. Ou seja, sistemas interativos exibem efeitos colaterais, o que dificulta o racioc´ınio sobre programas e impede a realizac¸a˜o de alguns tipos de otimizac¸a˜o. Rodrigo Bonifa´cio IO na Linguagem Funcional Haskell O problema Programas em Haskell sa˜o func¸o˜es matema´ticas puras: Programas Haskell na˜o exibem efeitos colaterais Por outro lado, operac¸o˜es de IO (como leitura da entrada padra˜o e escrita na sa´ıda padra˜o) apresentam efeitos colaterais. Rodrigo Bonifa´cio IO na Linguagem Funcional Haskell Soluc¸a˜o Diferentes abordagens propostas para combinar a noc¸a˜o de func¸o˜es puras com efeitos colaterais. A soluc¸a˜o com maior aceitac¸a˜o e´ baseda no idioma de Monads para programac¸a˜o funcional, que envolve um data type e um conjunto restrito de primitivas. Na˜o vamos explorar Monads aqui, apenas usar a te´cnica para operac¸o˜es de IO. IO Monad type IO a = World -> (a, World) return :: a -> IO a (>>=) :: IO a -> (a-> IO b) -> IO b Rodrigo Bonifa´cio IO na Linguagem Funcional Haskell Soluc¸a˜o Diferentes abordagens propostas para combinar a noc¸a˜o de func¸o˜es puras com efeitos colaterais. A soluc¸a˜o com maior aceitac¸a˜o e´ baseda no idioma de Monads para programac¸a˜o funcional, que envolve um data type e um conjunto restrito de primitivas. Na˜o vamos explorar Monads aqui, apenas usar a te´cnica para operac¸o˜es de IO. IO Monad type IO a = World -> (a, World) return :: a -> IO a (>>=) :: IO a -> (a-> IO b) -> IO b Rodrigo Bonifa´cio IO na Linguagem Funcional Haskell Soluc¸a˜o Diferentes abordagens propostas para combinar a noc¸a˜o de func¸o˜es puras com efeitos colaterais. A soluc¸a˜o com maior aceitac¸a˜o e´ baseda no idioma de Monads para programac¸a˜o funcional, que envolve um data type e um conjunto restrito de primitivas. Na˜o vamos explorar Monads aqui, apenas usar a te´cnica para operac¸o˜es de IO. IO Monad type IO a = World -> (a, World) return :: a -> IO a (>>=) :: IO a -> (a-> IO b) -> IO b Rodrigo Bonifa´cio IO na Linguagem Funcional Haskell Com isso: module Main where main :: IO() main = putStr "Forneca um numero n, para o somatorio: " >>= \_ -> readInt >>= \n -> putStr $ show (somatorio n) ++ "\n" somatorio :: Integer -> Integer somatorio = (\x -> sum [1..x]) readInt :: IO Integer readInt = getLine >>= \n -> return (read n) Rodrigo Bonifa´cio IO na Linguagem Funcional Haskell Rodrigo Bonifa´cio IO na Linguagem Funcional Haskell . . . ou usando a notac¸a˜o do module Main where main :: IO() main = do putStr "Forneca sua altura (em cm): " altura <- readFloat putStr "\n" putStr "Forneca seu peso (em kg): " peso <- readFloat putStr $ (show (peso / sqr (altura / 10.0)) ++ "\n") readFloat :: IO Float readFloat = getLine >>= \n -> return (read n) sqr x = x * x Rodrigo Bonifa´cio IO na Linguagem Funcional Haskell Quem quiser mergulhar em Monads . . . Rodrigo Bonifa´cio IO na Linguagem Funcional Haskell Rodrigo Bonifa´cio IO na Linguagem Funcional Haskell Abstraindo aspectos teo´ricos Programas interativos podem ser escritos em Haskell usando tipos que distinguem expresso˜es puras de ac¸o˜es impuras que podem envolver efeito colateral. IO a: Ac¸o˜es que retornam valores do tipo a IO Char: Ac¸o˜es que retornam valores do tipo Char IO (): Ac¸o˜es que envolvem apenas efeitos colaterais, na˜o retornando nenhum valor. Rodrigo Bonifa´cio IO na Linguagem Funcional Haskell Abstraindo aspectos teo´ricos Programas interativos podem ser escritos em Haskell usando tipos que distinguem expresso˜es puras de ac¸o˜es impuras que podem envolver efeito colateral. IO a: Ac¸o˜es que retornam valores do tipo a IO Char: Ac¸o˜es que retornam valores do tipo Char IO (): Ac¸o˜es que envolvem apenas efeitos colaterais, na˜o retornando nenhum valor. Rodrigo Bonifa´cio IO na Linguagem Funcional Haskell Abstraindo aspectos teo´ricos Programas interativos podem ser escritos em Haskell usando tipos que distinguem expresso˜es puras de ac¸o˜es impuras que podem envolver efeito colateral. IO a: Ac¸o˜es que retornam valores do tipo a IO Char: Ac¸o˜es que retornam valores do tipo Char IO (): Ac¸o˜es que envolvem apenas efeitos colaterais, na˜o retornando nenhum valor. Rodrigo Bonifa´cio IO na Linguagem Funcional Haskell Ac¸o˜es IO da bibliotecas pada˜o getChar :: IO Char putChar :: Char → IO () return :: a → IO a Com essas ac¸o˜es primitivas, outras ac¸o˜es podem ser facilmente derivadas: getLine :: IO String putStr :: String → IO () putStrLn :: String → IO () Rodrigo Bonifa´cio IO na Linguagem Funcional Haskell Ac¸o˜es IO da bibliotecas pada˜o getChar :: IO Char putChar :: Char → IO () return :: a → IO a Com essas ac¸o˜es primitivas, outras ac¸o˜es podem ser facilmente derivadas: getLine :: IO String putStr :: String → IO () putStrLn :: String → IO () Rodrigo Bonifa´cio IO na Linguagem Funcional Haskell Encadeamento de ac¸o˜es Em geral, estamos interessados em executar uma sequ¨eˆncia de ac¸o˜es. A notac¸a˜o do ... e´ um recurso sinta´tico para definir a ordem em que uma sequ¨eˆncia de ac¸o˜es deve ser realizada. A func¸a˜o sequence :: [IO a] → IO () pode ser usada para encadear uma sequ¨eˆncia de ac¸o˜es definida dinamicamente (usando recursa˜o, por exemplo). Tal func¸a˜o e´ bastante usada nos exemplos de fractais. Rodrigo Bonifa´cio IO na Linguagem Funcional Haskell Encadeamento de ac¸o˜es Em geral, estamos interessados em executar uma sequ¨eˆncia de ac¸o˜es. A notac¸a˜o do ... e´ um recurso sinta´tico para definir a ordem em que uma sequ¨eˆncia de ac¸o˜es deve ser realizada. A func¸a˜o sequence :: [IO a] → IO () pode ser usada para encadear uma sequ¨eˆncia de ac¸o˜es definida dinamicamente (usando recursa˜o, por exemplo). Tal func¸a˜o e´ bastante usada nos exemplos de fractais. Rodrigo Bonifa´cio IO na Linguagem Funcional Haskell Exemplos: foo :: IO (String,String) foo = do putStr "Forneca uma string: " x <- getLine putStr "Forneca uma segunda string: " y <- getLine return (x, y) main :: IO () main = do pair <- foo let s1 = length (fst pair) let s2 = length (snd pair) putStrLn $ (fst pair) ++ " " ++ (snd pair) putStrLn $ "Tamanho total das strings " ++ (show (s1 + s2)) Rodrigo Bonifa´cio IO na Linguagem Funcional Haskell Manipulac¸a˜o de arquivos Haskell manipula arquivos atrave´s do tipo FilePath e um conjunto de ac¸o˜es IO: type FilePath = String readFile :: FilePath → IO String writeFile :: FilePath → String → IO() Rodrigo Bonifa´cio IO na Linguagem Funcional Haskell
Compartilhar