Шаг 25.
Основы языка Haskell. Основные типы данных, операции, способы определения функций. Понятие "чистота языка программирования"
На этом шаге мы рассмотрим данное понятие и его реализацию.
Язык Haskell обладает свойством чистоты.
- Определение.
- Говорят, что язык программирования обладает свойством чистоты, если функции, определяемые и используемые в языке:
- не являются недетерминированными, т.е. результат их выполнения зависит исключительно от значений аргументов;
- не могут иметь побочных эффектов.
- Определение.
- Недетерминированными функциями называются функции, для которых вызов функции дважды с одним и тем же набором значений входных аргументов может привести к тому, что в качестве результата
возвращаются разные значения.
Другими словами, недетерминированность функции - это возможность возвращения функцией разных значений, несмотря на то, что ей передаются на вход одинаковые значения входных аргументов.
Итак, для недетерминированных функций их таблицы значений выглядели бы как список (может быть, бесконечный) возможных значений, которые она принимает на заданном наборе входных параметров.
- Определение.
- Побочным эффектом функции (в программировании) называется возможность в процессе выполнения вычислений:
- чтения и модификации значений параметров, переданных в функцию, т.е. по сути возможность деструктивного присваивания, когда в процессе вычисления выходного значения функции изменяется и значение входного параметра;
- осуществления операций ввода/вывода;
- реагирования на исключительные операции и вызов их обработчиков.
Итак, в чистом функциональном программировании:
- отсутствует оператор присваивания;
- объекты нельзя изменять и уничтожать, можно только создавать новые путём декомпозиции и синтеза существующих;
- все функции свободны от побочных эффектов; более точно, утверждается, что функциональные языки отличаются от других языков тщательным контролем над побочными эффектами.
Тем не менее, функции с побочными эффектами полностью убрать из языков функционального программирования нельзя. В первую очередь это относится к вводу/выводу, т.к. любая операция ввода данных от
пользователя является действием с побочным эффектом, т.к. нельзя заранее предвидеть, что именно введёт пользователь в качестве значений параметров, использующихся в вычислительном процессе.
Однако сложно представить себе полноценный язык программирования, где нет возможности осуществлять ввод данных от пользователя в интерактивном режиме, а также осуществлять вывод данных.
Замечание (важное) [1, с.54].
Для обеспечения возможности использования ввода/вывода без умаления свойства чистоты во многих языках функционального программирования, в том числе и в языке Haskell, используется специальный
механизм, названный монадой.
Монады как бы обёртывают необходимые императивные свойства, не допуская их смешивания с чистым синтаксисом функционального языка. Использование монад позволило реализовать все те узкие места, которые
регламентировали наличие побочных эффектов в функциях.
Так, например, для обеспечения ввода/вывода в языке Haskell реализована стандартная монада IO, вне которой невозможно выполнить ни одной операции ввода/вывода.
(1)Душкин Р.В. Функциональное программирование на языке Haskell. - М.: ДМК Пресс, 2007. - 608 с.
На следующем шаге мы рассмотрим литературное программирование.
Предыдущий шаг
Содержание
Следующий шаг