В информатике , чисто функциональное программирование обычно обозначает программирование парадигма -a стиль построения структуры и элементов компьютерных программ, которые обрабатывают все вычисления в качестве оценки математических функций . Чисто функциональное программирование также может быть определено путем запрета изменений состояния и изменяемых данных.
Чисто функциональное программирование заключается в обеспечении того, чтобы функции внутри функциональной парадигмы зависели только от своих аргументов, независимо от какого-либо глобального или локального состояния.
Разница между чистым и не чистым функциональным программированием
Точное различие между чистым и нечистым функциональным программированием является предметом споров. [1]
Программа обычно называется функциональным , если он использует некоторые концепции функционального программирования , такие как функции первого класса и функции высшего порядка . [2] Однако функция первого класса не обязательно должна быть чисто функциональной, поскольку она может использовать методы императивной парадигмы, такие как массивы или методы ввода / вывода , которые не являются чисто функциональными программами. На самом деле, первые языки программирования цитируется как функциональные, IPL и Lisp , [3] [4] оба были «нечистые» функциональные языки по текущему определению.
Чисто структура функциональных данных являются стойкой . Для функционального программирования требуется постоянство; без него одно и то же вычисление могло бы вернуть разные результаты. Функциональное программирование может использовать постоянные не чисто функциональные структуры данных , в то время как эти структуры данных не могут использоваться в чисто функциональных программах.
Свойства чисто функционального программирования
Строгая и нестрогая оценка
Каждая стратегия оценки, которая заканчивается чисто функциональной программой, дает один и тот же результат. В частности, это гарантирует, что программисту не нужно учитывать, в каком порядке оцениваются программы, поскольку активное вычисление вернет тот же результат, что и ленивое вычисление . Однако все еще возможно, что нетерпеливое вычисление может не завершиться, пока ленивое вычисление той же программы останавливается. Преимущество этого состоит в том, что ленивое вычисление может быть реализовано намного проще; поскольку все выражения будут возвращать один и тот же результат в любой момент (независимо от состояния программы), их оценка может быть отложена на сколько угодно времени.
Параллельные вычисления
Чисто функциональное программирование упрощает параллельные вычисления [5], поскольку две чисто функциональные части оценки никогда не взаимодействуют.
Структуры данных
Чисто функциональные структуры данных часто представляются иначе, чем их императивные аналоги. [6] Например, массив с постоянным доступом и обновлением является базовым компонентом большинства императивных языков, а многие императивные структуры данных, такие как хэш-таблица и двоичная куча , основаны на массивах. Массивы можно заменить картой или списком произвольного доступа , который допускает чисто функциональную реализацию, но время доступа и обновления является логарифмическим . Следовательно, чисто функциональные структуры данных могут использоваться в языках, которые не являются функциональными, но они могут быть не самым эффективным доступным инструментом, особенно если постоянство не требуется.
В общем, преобразование императивной программы в чисто функциональную также требует обеспечения того, чтобы ранее изменяемые структуры теперь явно возвращались функциями, которые их обновляют; такая структура программы называется стилем передачи из хранилища .
Чисто функциональный язык
Чисто функциональный язык - это язык, допускающий только чисто функциональное программирование. Однако чисто функциональные программы могут быть написаны на языках, которые не являются чисто функциональными.
Рекомендации
- ^ Сабри, Амр (январь 1993). «Что такое чисто функциональный язык?». Журнал функционального программирования . 8 (1): 1-22. CiteSeerX 10.1.1.27.7800 . DOI : 10.1017 / S0956796897002943 .
- ^ Атенсио, Луис (18 июня 2016 г.). Функциональное программирование на Javascript . Публикации Мэннинга. ISBN 978-1617292828.
- ^ Мемуара Герберт А. Саймон (1991), Модели My Life pp.189-190 ISBN 0-465-04640-1 утверждает, что он, Эл Ньюэлл и Клифф Шоу «обычно считаются родителями [области] искусственного интеллекта» за написание Logic Theorist , программы, которая доказывала теоремы из Principia Mathematica автоматически. Для этого им пришлось изобрести язык и парадигму, которые, если смотреть ретроспективно, включают функциональное программирование.
- ^ Маккарти, Джон (июнь 1978 г.). «История Лиспа» . В конференции ACM SIGPLAN по истории языков программирования : 217–223. DOI : 10.1145 / 800025.808387 . CS1 maint: обескураженный параметр ( ссылка )
- ^ Марлоу, Саймон (18 июня 2013 г.). Параллельное и параллельное программирование в Haskell: методы многоядерного и многопоточного программирования . O'Reilly Media. ISBN 978-1449335946.
- ^ Чисто функциональные структуры данных по Крис Окасаки , Cambridge University Press , 1998, ISBN 0-521-66350-4