Чисто функциональное программирование


В информатике чисто функциональное программирование обычно обозначает парадигму программирования — стиль построения структуры и элементов компьютерных программ, — который рассматривает все вычисления как оценку математических функций .

Состояние программы и изменяемые объекты обычно моделируются с помощью временной логики , как явные переменные, которые представляют состояние программы на каждом этапе выполнения программы: состояние переменной передается как входной параметр функции преобразования состояния, которая возвращает обновленное состояние как часть его возвращаемого значения. Этот стиль обрабатывает изменения состояния без потери ссылочной прозрачности программных выражений.

Чисто функциональное программирование состоит в обеспечении того, чтобы функции внутри функциональной парадигмы зависели только от своих аргументов, независимо от какого-либо глобального или локального состояния. Чисто функциональная подпрограмма имеет видимость только изменений состояния, представленных переменными состояния, включенными в ее область действия.

Точная разница между чистым и нечистым функциональным программированием вызывает споры. Предлагаемое Сабри определение чистоты состоит в том, что все распространенные стратегии оценки (вызов по имени, вызов по значению и вызов по необходимости) дают один и тот же результат, игнорируя стратегии, которые ошибочны или расходятся. [1]

Обычно говорят, что программа функциональна, если в ней используются некоторые концепции функционального программирования , такие как функции первого класса и функции высшего порядка . [2] Однако первоклассная функция не обязательно должна быть чисто функциональной, поскольку она может использовать методы из императивной парадигмы, такие как массивы или методы ввода/вывода , использующие изменяемые ячейки, которые обновляют свое состояние в качестве побочных эффектов. Фактически, самые ранние языки программирования, названные функциональными, IPL и Lisp , [3] [4] являются «нечистыми» функциональными языками по определению Сабри.

Чисто функциональные структуры данных являются персистентными . Для функционального программирования требуется постоянство; без него одно и то же вычисление могло бы вернуть разные результаты. Функциональное программирование может использовать постоянные не чисто функциональные структуры данных , в то время как эти структуры данных не могут использоваться в чисто функциональных программах.