Haskell - Entrada y salida

Todos los ejemplos que hemos discutido hasta ahora son de naturaleza estática. En este capítulo, aprenderemos a comunicarnos dinámicamente con los usuarios. Aprenderemos diferentes técnicas de entrada y salida utilizadas en Haskell.

Archivos y transmisiones

Hasta ahora hemos codificado todas las entradas en el propio programa. Hemos estado tomando entradas de variables estáticas. Ahora, aprendamos a leer y escribir desde un archivo externo.

Creemos un archivo y lo llamemos "abc.txt". Luego, ingrese las siguientes líneas en este archivo de texto: "Bienvenido a Tutorialspoint. Aquí, obtendrá el mejor recurso para aprender Haskell".

A continuación, escribiremos el siguiente código que mostrará el contenido de este archivo en la consola. Aquí, estamos usando la función readFile () que lee un archivo hasta que encuentra un carácter EOF.

main = do  
   let file = "abc.txt" 
   contents <- readFile file 
   putStrLn contents

El fragmento de código anterior leerá el archivo "abc.txt" como una cadena hasta que encuentre cualquier carácter de fin de archivo. Este fragmento de código generará la siguiente salida.

Welcome to Tutorialspoint
Here, you will get the best resource to learn Haskell.

Observe que lo que sea que esté imprimiendo en el terminal está escrito en ese archivo.

Argumento de la línea de comandos

Haskell también ofrece la posibilidad de operar un archivo a través del símbolo del sistema. Regresemos a nuestra terminal y escriba"ghci". Luego, escriba el siguiente conjunto de comandos:

let file = "abc.txt" 
writeFile file "I am just experimenting here." 
readFile file

Aquí, hemos creado un archivo de texto llamado "abc.txt". A continuación, hemos insertado una declaración en el archivo usando el comandowriteFile. Finalmente, hemos usado el comandoreadFilepara imprimir el contenido del archivo en la consola. Nuestro código producirá el siguiente resultado:

I am just experimenting here.

Excepciones

Un exceptionpuede considerarse como un error en el código. Es una situación en la que el compilador no obtiene la salida esperada en tiempo de ejecución. Como cualquier otro buen lenguaje de programación, Haskell proporciona una forma de implementar el manejo de excepciones.

Si está familiarizado con Java, es posible que conozca el bloque Try-Catch donde generalmente arrojamos un error y detectamos el mismo en el catchbloquear. En Haskell, también tenemos la misma función para detectar errores en tiempo de ejecución.

La definición de función de tryparece "try :: Exception e => IO a -> IO (Either ea)". Eche un vistazo al siguiente código de ejemplo. Muestra cómo puede detectar la excepción "Dividir por cero".

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

En el ejemplo anterior, hemos utilizado el try función de la Control.Exceptionmódulo, por lo tanto, estamos detectando la excepción de antemano. La pieza de código anterior producirá la siguiente salida en la pantalla.

Caught exception: divide by zero