Skip to main content

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

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

Как следует из названия, функции являются фундаментальной частью этой парадигмы программирования. Функции могут быть вложены в другие функции, называемые функциями более высокого порядка, и каждая функция более высокого порядка может быть разбита на функции строительного блока, которые легко понять и отладить. Примерами некоторых функций более высокого порядка являются Map и Nest. Функция Map берет функцию F и список переменных, например (x, y, z), и выдает результат в виде списка: Map [F, (x, y, z)] = (F (x), F (у), F (z)). Nest принимает функцию F, переменную x и количество итераций: Nest [F, x, 3] = F (F (F (x))).

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

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

Функциональное программирование имеет много преимуществ по сравнению с другими парадигмами программирования. Функции с понятными входами и выходами легко читать и понимать. После тщательной отладки функции ее можно надежно использовать в других приложениях. Многоядерные машины могут быть в состоянии вычислять функции, которые оцениваются независимо параллельно, значительно улучшая производительность программ.

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

Академики, как правило, предпочитают функциональное программирование, поскольку оно обеспечивает ясный и понятный способ программирования сложных реальных задач. Некоторые чистые языки - Хаскель и Эрланг. Mathematica специализируется на символической математике, R специализируется на статистике, а J специализируется на финансовом анализе. Мультипарадигмальные языки, такие как Scala и F #, поддерживают как функциональное программирование, так и другие стили программирования.