Haskell - Ingresso e uscita

Tutti gli esempi che abbiamo discusso finora sono di natura statica. In questo capitolo impareremo a comunicare dinamicamente con gli utenti. Impareremo diverse tecniche di input e output utilizzate in Haskell.

File e flussi

Finora abbiamo codificato tutti gli input nel programma stesso. Abbiamo preso input da variabili statiche. Ora impariamo a leggere e scrivere da un file esterno.

Creiamo un file e chiamiamolo "abc.txt". Quindi, inserisci le seguenti righe in questo file di testo: "Benvenuto in Tutorialspoint. Qui troverai la migliore risorsa per imparare Haskell."

Successivamente, scriveremo il seguente codice che visualizzerà il contenuto di questo file sulla console. Qui stiamo usando la funzione readFile () che legge un file finché non trova un carattere EOF.

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

La parte di codice precedente leggerà il file "abc.txt" come una stringa fino a quando non incontra un carattere di fine file. Questa parte di codice genererà il seguente output.

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

Osserva che qualunque cosa stia stampando sul terminale è scritta in quel file.

Argomento della riga di comando

Haskell fornisce anche la possibilità di gestire un file tramite il prompt dei comandi. Torniamo al nostro terminale e scriviamo"ghci". Quindi, digita il seguente set di comandi:

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

Qui abbiamo creato un file di testo chiamato "abc.txt". Successivamente, abbiamo inserito un'istruzione nel file utilizzando il comandowriteFile. Infine, abbiamo utilizzato il comandoreadFileper stampare il contenuto del file sulla console. Il nostro codice produrrà il seguente output:

I am just experimenting here.

Eccezioni

Un exceptionpuò essere considerato un bug nel codice. È una situazione in cui il compilatore non ottiene l'output previsto in fase di esecuzione. Come ogni altro buon linguaggio di programmazione, Haskell fornisce un modo per implementare la gestione delle eccezioni.

Se hai familiarità con Java, potresti conoscere il blocco Try-Catch in cui di solito generiamo un errore e rileviamo lo stesso nel catchbloccare. In Haskell, abbiamo anche la stessa funzione per rilevare gli errori di runtime.

La definizione della funzione di tryè simile a "try :: Exception e => IO a -> IO (Either ea)". Dai un'occhiata al seguente codice di esempio. Mostra come catturare l'eccezione "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

Nell'esempio sopra, abbiamo usato il file inbuilt try funzione del Control.Exceptionmodulo, quindi stiamo intercettando l'eccezione in anticipo. La parte di codice sopra restituirà l'output sotto lo schermo.

Caught exception: divide by zero