Haskell - entrada e saída
Todos os exemplos que discutimos até agora são de natureza estática. Neste capítulo, aprenderemos a se comunicar dinamicamente com os usuários. Aprenderemos diferentes técnicas de entrada e saída usadas em Haskell.
Arquivos e streams
Até agora, codificamos todas as entradas do próprio programa. Temos obtido entradas de variáveis estáticas. Agora, vamos aprender como ler e escrever a partir de um arquivo externo.
Vamos criar um arquivo com o nome "abc.txt". Em seguida, insira as seguintes linhas neste arquivo de texto: "Bem-vindo ao Tutorialspoint. Aqui, você obterá o melhor recurso para aprender Haskell."
A seguir, escreveremos o código a seguir, que exibirá o conteúdo desse arquivo no console. Aqui, estamos usando a função readFile () que lê um arquivo até encontrar um caractere EOF.
main = do
let file = "abc.txt"
contents <- readFile file
putStrLn contents
O trecho de código acima lerá o arquivo "abc.txt" como uma String até encontrar qualquer caractere de Fim de Arquivo. Este pedaço de código irá gerar a seguinte saída.
Welcome to Tutorialspoint
Here, you will get the best resource to learn Haskell.
Observe que tudo o que está sendo impresso no terminal está escrito naquele arquivo.
Argumento de linha de comando
Haskell também fornece a facilidade de operar um arquivo por meio do prompt de comando. Vamos voltar ao nosso terminal e digitar"ghci". Em seguida, digite o seguinte conjunto de comandos -
let file = "abc.txt"
writeFile file "I am just experimenting here."
readFile file
Aqui, criamos um arquivo de texto chamado "abc.txt". Em seguida, inserimos uma instrução no arquivo usando o comandowriteFile. Finalmente, usamos o comandoreadFilepara imprimir o conteúdo do arquivo no console. Nosso código produzirá a seguinte saída -
I am just experimenting here.
Exceções
A exceptionpode ser considerado um bug no código. É uma situação em que o compilador não obtém a saída esperada no tempo de execução. Como qualquer outra boa linguagem de programação, Haskell fornece uma maneira de implementar o tratamento de exceções.
Se você estiver familiarizado com Java, então deve conhecer o bloco Try-Catch, onde geralmente lançamos um erro e detectamos o mesmo no catchquadra. Em Haskell, também temos a mesma função para capturar erros de tempo de execução.
A definição da função de tryse parece com "try :: Exception e => IO a -> IO (Either ea)". Dê uma olhada no código de exemplo a seguir. Mostra como você pode capturar a exceção "Divide by Zero".
import Control.Exception
main = do
result <- try (evaluate (5 `div` 0)) :: IO (Either SomeException Int)
case result of
Left ex -> putStrLn $ "Caught exception: " ++ show ex
Right val -> putStrLn $ "The answer was: " ++ show val
No exemplo acima, usamos o embutido try função do Control.Exceptionmódulo, portanto, estamos capturando a exceção de antemão. O trecho de código acima renderá abaixo da saída na tela.
Caught exception: divide by zero