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