Учебники

Haskell — вход и выход

Все примеры, которые мы обсуждали до сих пор, носят статический характер. В этой главе мы научимся динамически общаться с пользователями. Мы изучим различные методы ввода и вывода, используемые в Haskell.

Файлы и потоки

До сих пор мы жестко закодировали все входные данные в самой программе. Мы принимаем данные от статических переменных. Теперь давайте научимся читать и писать из внешнего файла.

Давайте создадим файл и назовем его «abc.txt». Затем введите следующие строки в этом текстовом файле: «Добро пожаловать в Tutorialspoint. Здесь вы получите лучший ресурс для изучения Haskell».

Далее мы напишем следующий код, который будет отображать содержимое этого файла на консоли. Здесь мы используем функцию readFile (), которая читает файл до тех пор, пока не найдет символ EOF.

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

Приведенный выше фрагмент кода будет считывать файл «abc.txt» как строку, пока не встретит какой-либо символ конца файла. Этот кусок кода будет генерировать следующий вывод.

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

Обратите внимание, что все, что печатается на терминале, записано в этом файле.

Аргумент командной строки

Haskell также предоставляет возможность управлять файлом через командную строку. Давайте вернемся к нашему терминалу и наберем «ghci» . Затем введите следующий набор команд —

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

Здесь мы создали текстовый файл с именем «abc.txt». Далее мы вставили оператор в файл с помощью команды writeFile . Наконец, мы использовали команду readFile для печати содержимого файла на консоли. Наш код выдаст следующий результат:

I am just experimenting here.

Исключения

Исключение можно рассматривать как ошибку в коде. Это ситуация, когда компилятор не получает ожидаемый результат во время выполнения. Как и любой другой хороший язык программирования, Haskell предоставляет способ реализации обработки исключений.

Если вы знакомы с Java, то вам может быть знаком блок Try-Catch, где мы обычно выдаем ошибку и отлавливаем ее в блоке catch . В Haskell у нас также есть та же функция для отлова ошибок во время выполнения.

Определение функции try выглядит так: «try :: Exception e => IO a -> IO (Either ea)». Взгляните на следующий пример кода. Он показывает, как вы можете поймать исключение «Разделить на ноль».

Live Demo

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 

В приведенном выше примере мы использовали встроенную функцию try модуля Control.Exception , поэтому мы заранее перехватываем исключение. Выше кусок кода будет отображаться ниже вывода на экране.