Buscar

Linguagens de Programação - IO na Linguagem Funcional Haskell

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

Outros materiais

Materiais relacionados

Perguntas relacionadas

Perguntas Recentes