Haskell - wejście i wyjście

Wszystkie przykłady, które omówiliśmy do tej pory, mają charakter statyczny. W tym rozdziale nauczymy się dynamicznie komunikować się z użytkownikami. Nauczymy się różnych technik wejścia i wyjścia stosowanych w Haskell.

Pliki i strumienie

Do tej pory zakodowaliśmy na stałe wszystkie dane wejściowe w samym programie. Pobieraliśmy dane wejściowe ze zmiennych statycznych. Teraz nauczmy się czytać i pisać z zewnętrznego pliku.

Utwórzmy plik i nazwijmy go „abc.txt”. Następnie wprowadź następujące wiersze w tym pliku tekstowym: „Witamy w Tutorialspoint. Tutaj uzyskasz najlepsze źródło wiedzy o Haskellu”.

Następnie napiszemy następujący kod, który wyświetli zawartość tego pliku na konsoli. Tutaj używamy funkcji readFile (), która czyta plik, dopóki nie znajdzie znaku EOF.

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

Powyższy fragment kodu odczyta plik „abc.txt” jako ciąg znaków, dopóki nie napotka dowolnego znaku końca pliku. Ten fragment kodu wygeneruje następujące dane wyjściowe.

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

Zwróć uwagę, że cokolwiek wypisuje na terminalu, jest zapisane w tym pliku.

Argument wiersza poleceń

Haskell zapewnia również możliwość obsługi pliku za pomocą wiersza poleceń. Wróćmy do naszego terminala i wpiszmy"ghci". Następnie wpisz następujący zestaw poleceń -

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

Tutaj utworzyliśmy plik tekstowy o nazwie „abc.txt”. Następnie wstawiliśmy instrukcję do pliku za pomocą poleceniawriteFile. Wreszcie użyliśmy poleceniareadFilewydrukować zawartość pliku na konsoli. Nasz kod wygeneruje następujący wynik -

I am just experimenting here.

Wyjątki

Na exceptionmożna uznać za błąd w kodzie. Jest to sytuacja, w której kompilator nie otrzymuje oczekiwanego wyniku w czasie wykonywania. Jak każdy inny dobry język programowania, Haskell zapewnia sposób implementacji obsługi wyjątków.

Jeśli znasz Javę, być może znasz blok Try-Catch, w którym zwykle zgłaszamy błąd i łapiemy to samo w catchblok. W Haskell mamy również tę samą funkcję do wychwytywania błędów uruchomieniowych.

Definicja funkcji trywygląda jak "try :: Exception e => IO a -> IO (albo ea)". Spójrz na poniższy przykładowy kod. Pokazuje, jak można złapać wyjątek „Podziel przez 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

W powyższym przykładzie użyliśmy wbudowanego try funkcja Control.Exceptionmoduł, dlatego wcześniej wychwytujemy wyjątek. Powyższy fragment kodu spowoduje wyświetlenie poniżej wyniku na ekranie.

Caught exception: divide by zero