Виды языков функционального программирования

Функциональное программирование: что это такое, преимущества и недостатки

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

Haskell, Erlang, Clojur – яркие представители ФП. На другом берегу такие мастодонты, как C++, Java. Конечно, принципы первой группы языков применимы далеко не везде, однако в своих сферах они практически незаменимы. О том, что такое функциональное программирование, вы узнаете из нашего материала.

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

Практически каждый программист первым делом изучал объектно-ориентированную методологию разработок. Обычно вхождение в эту специальность предполагает знакомство с языками Java или C++, а в лучшем случае Ruby, Python или C#. Такой разработчик уже точно будет иметь представление о классах, объектах и т.д. Но вот основы функционального программирования, скорее всего, ему еще не будут знакомы. Эта парадигма существенно отличается не только от объектно-ориентированного подхода, но и от других методологий (процедурная, прототипно-ориентированная и др.).

Функциональное программирование становится все более востребованным. Это обусловлено рядом факторов. Нельзя сказать, что это новая парадигма. Так, еще в девяностых годах появился язык программирования Haskell, который и сейчас активно используется для ФП. В эту же категорию могут быть отнесены также Erlang, Scala, Clojure. Все подобные языки программирования объединяет одно очень важное преимущество. С их помощью можно писать конкурентные программные продукты, поэтому при их использовании отпадают такие проблемы, как взаимные блокировки и потокобезопасность.

Читайте также:  Объектно ориентированной технологии программирования верно

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

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

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

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

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

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

Можно решить, что термин «функциональный стиль программирования» говорит о функциях.

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

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

Поварам необходимо предоставить пошаговую инструкцию по приготовлению каждого блюда. К примеру:

  1. Наполнить кастрюлю водой.
  2. Разместить кастрюлю на плите и установить определенную температуру нагрева.
  3. Посолить воду в кастрюле с использованием нужного количества соли.
  4. При приготовлении 10 порций, нужно использовать 1 свеклу, для 20 порций – 2 две свёклы и т.д.
  5. Почистить всю отобранную свеклу.

Команда GeekBrains совместно с международными специалистами по развитию карьеры подготовили материалы, которые помогут вам начать путь к профессии мечты.

Подборка содержит только самые востребованные и высокооплачиваемые специальности и направления в IT-сфере. 86% наших учеников с помощью данных материалов определились с карьерной целью на ближайшее будущее!

Скачивайте и используйте уже сегодня:

Александр Сагун - исполнительный директор Geekbrains

Топ-30 самых востребованных и высокооплачиваемых профессий 2023

Поможет разобраться в актуальной ситуации на рынке труда

Подборка 50+ ресурсов об IT-сфере

Только лучшие телеграм-каналы, каналы Youtube, подкасты, форумы и многое другое для того, чтобы узнавать новое про IT

ТОП 50+ сервисов и приложений от Geekbrains

Безопасные и надежные программы для работы в наши дни

Задача повара четко выполнять шаги инструкции в заданной очередности. Недопустимо вначале посолить, а потом набрать воды или взять 20 свекл на 10 порций. Весь порядок и характер действий повара определяет инструкция, которая составлена «программистом» процесса. Такая методика присуща императивному программированию. Другими словами, происходит управление исполнителем, которые претворяет в жизнь наши задания.

Инструкция для администратора отличается от той, которая составлена для повара. В этом случае формируется специальный свод правил:

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

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

Преимущества и недостатки функционального программирования

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

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

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

5 принципов функционального программирования

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

Применяются исключительно чистые функции

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

  • Функции, которые вызывает одинаковым аргументом, обязательно должны возвращать одно и то же значение.
  • В процессе выполнения функции не должны иметь место побочные эффекты.

В соответствии с первым условием, к примеру, при вызове функции (подпрограммы) sum(2, 3), мы понимаем, что всегда в результате получим 5. Но, если идет обращение к подпрограмме rand() или к переменным, которые не определены функцией, то условие чистоты не соблюдается, а это является недопустимым моментом для рассматриваемой парадигмы.

Условие номер два в отношении недопустимости побочных эффектов является более обширным. Что такое побочный эффект? В контексте данной парадигмы это изменение какого-либо элемента, не связанного с функцией, исполняемой в конкретный момент. Примерами таких эффектов, которые приводят к нарушению условия чистоты, могут служить: вызовы переменной вне функции, вывод в консоль, вызов исключения, чтение файловых данных.

На первый взгляд такое ограничение кажется очень строгим, но при наличии уверенности в том, что обращение к функции не спровоцирует «внешних» изменений, подпрограмму можно применять во всех сценариях. Эта особенность обеспечивает конкурентность программирования многопоточных программ.

В данной парадигме предусматривается применение функций первого класса и высшего порядка

Такой же принцип, помимо языков функционального программирования, действует в Javascript, PHP и в ряде других систем. Но для ФП он является обязательным.

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

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

Неизменность переменных

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

Относительная прозрачность подпрограмм

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

Допустим, мы имеем Java-функцию, суммирующую 3 и 5:

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

printText() // Returns nothing, but prints «Hello World»

В этом случае подпрограмма не осуществляет возврат, а просто выводит текст на монитор. При замене вызова функции на «ничто» состояние консоли будет другим. Такая подпрограмма не считается относительно прозрачной.

ФП базируется на лямбда-исчислении

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

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

Лямбда-исчисление – более обширная система, но в этом материале мы уделили внимание только основным ее свойствам, имеющим отношение к функциональному программированию.

Языки функционального программирования

Элементы функционального программирования могут поддерживаться далеко не всеми языками. Есть примеры систем, которые разрабатывались специально для такой парадигмы (Haskel), а существуют и такие языки, которые могут применяться, как в объективно-ориентированных, так и в функциональных методиках (JavaScript). Встречаются также языки, которые совершенно невозможно использовать для ФП.

Источник

Оцените статью