НОУ ІНТУІТ, Лекція, Основні операції введення
Система введення - виведення в Haskell є суто функціональною, але при цьому має виразну силу звичайних мов програмування. Для цього Haskell використовує монаду для інтеграції операцій введення - виведення в суто функціональний контекст .
Монада введення - виведення використовується в Haskell як сполучна ланка між значеннями, властивими функціональній мові, і діями, що характеризують операції введення - виведення та імперативне програмування загалом. Порядок обчислення виразів у Haskell обмежений лише залежностями даних; реалізація має значну свободу у виборі цього порядку. Дії, проте, мають бути впорядковані певним чином виконання програми і, зокрема, введення - висновку, щоб правильно інтерпретовані. У Haskell монада введення - виведення надає користувачеві спосіб вказати послідовне зв'язування дій, і реалізація повинна дотримуватися цього порядку.
7.1. Стандартні функції введення - виведення
Хоча Haskell забезпечує досить складні засоби введення-виводу, визначені в бібліотеці IO, багато програм на Haskell можна писати, використовуючи лише кілька простих функцій, які експортуються з Prelude і описані в цьому розділі.
Усі функції введення - виводу, описані тут, мають справу із символами. Обробка символу нового рядка буде різнитися у різних системах. Наприклад, два символи введення, повернення каретки та переклад рядка можуть бути зчитані як один символ нового рядка . Ці функції не можна використовувати в програмах для бінарного введення - виведення.
Далі згадаємо, що String є синонімом для [Char] (розділ "6.1.2").
Функції виведення
Ці функції записують устандартний пристрій виведення (зазвичай це термінал користувача).
Функція print виводить значення будь-якого придатного для друку типу стандартного пристрою виведення. Придатні для друку типи – це ті типи, які є примірниками класу Show; print перетворює значення рядка для виведення, використовуючи операцію show , і додає символ нового рядка .
Наприклад, програма для друку перших 20 цілих чисел та їх ступенів 2 могла бути записана так:
Функції введення
Ці функції зчитують дані зі стандартного пристрою введення (зазвичай це термінал користувача).
Операція getChar викликає виняток (розділ "7.3") при появі ознаки кінця файлу, а предикат isEOFError, який розпізнає цей виняток, визначений у бібліотеці IO. Операція getLine викликає виняток за тих самих обставин, як і hGetLine , визначена бібліотеці IO .
Операція getContents повертає все введення користувача у вигляді одного рядка, який зчитується ліниво, при необхідності. Функція interact приймає як аргумент функцію типу String -> String. Все введення зі стандартного пристрою введення передається цій функції як аргумент, а результуючий рядок виводиться на стандартний пристрій виведення.
Зазвичай операція read із класу Read використовується для перетворення рядка на значення. Функція readIO схожа на read, за винятком того, що вона попереджає монаду введення - виведення про помилку аналізу замість завершення програми. Функція readLn поєднує getLine і readIO.
Наступна програма просто видаляє всі символи, що не є ASCII, зі свого стандартного введення та відображає результат на своєму стандартному виведенні. (Функція isAscii визначена в бібліотеці.)
Ці функції оперуютьфайли символів. Файли вказуються у вигляді рядків, використовуючи певний, залежить від реалізації, спосіб дозволу рядків як імен файлів.
Функції writeFile і appendFile відповідно записують або додають у кінець рядок, свій другий аргумент, файл, свій перший аргумент. Функція readFile зчитує файл та повертає вміст файлу у вигляді рядка. Файл зчитується ліниво, на вимогу, як у getContents .
Зауважте, що writeFile і appendFile записують літеральний рядок у файл. Щоб записати значення будь-якого придатного для друку типу, як у print , спочатку використовується функція show для перетворення значення рядок.