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

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

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

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

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

Рассмотрим пример программы, которая вычисляет сумму первых n чисел. В приведенном ниже фрагменте кода функция sum () изменяет значение переменной total, выходящей за рамки ее области. Не только это, но и начальное значение также влияет на конечное значение переменной total. Следовательно, функция sum не всегда дает один и тот же результат, даже если мы передаем ей один и тот же ввод.

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

Нет оператора присваивания, нет сохранения состояния. Никаких петель. Красиво, не правда ли?

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

Особенности функционального программирования:

Большинство языков функционального программирования поддерживают следующие функции:

Функции высшего порядка:

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

Первоклассные функции:

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

Рекурсия:

Итерация (цикл) в функциональных языках обычно выполняется с помощью рекурсии. Рекурсивные функции вызывают сами себя и продолжают повторяться до тех пор, пока не достигнут базового случая.

Ленивая оценка:

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

Ссылочная прозрачность:

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

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

Теперь рассмотрим следующий пример, мы можем заменить все вхождения n на его значение, поскольку оно не меняется на протяжении всей программы. Итак, нижеприведенную программу можно назвать ссылочно-прозрачной.

Функциональное и процедурное программирование:

В процедурном программировании выполнение программы представляет собой последовательность императивных команд, которые могут неявно изменять общее состояние (общая сумма в приведенном выше примере (рисунок 1.1) является общей).

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

Логическое программирование:

В логическом стиле программирования сначала мы определяем некоторые известные факты и правила, чтобы компьютеры знали о предметной области. Затем, когда мы задаем компьютеру запросы, он делает логический вывод на основе изначально заданных фактов и правил и возвращает решение нашей проблемы. Логический язык программирования включает Пролог, программирование наборов ответов (ASP) и Даталог.

Логическая парадигма использует декларативный подход к решению проблем. В логическом программировании у нас есть различные логические утверждения, и их выполнение выполняется с помощью генератора моделей, поведение которого не контролируется программистом. Мы можем создавать логические утверждения, используя правила, которые записываются в форме предложений , в приведенном ниже примере Пролога H - это голова, а B - это тело:

H :- B.

поэт (X): - человек (x).

Мы читаем это так: X - поэт, если x - человек.

Факты - это правила, не имеющие тела и записанные в упрощенной форме как:

H.

животное (кошка)

Мы читаем это так: кошка - это животное.

Вот пример правил, которые учит компьютер тому, что Сэм любит есть, а что не любит.

Поскольку компьютер знает, что нравится и не нравится Сэму, теперь мы можем задавать такие вопросы, как нравится Сэм paneer_tikka или нет?

? - лайки (sam, paneer_tikka).

истинный.

Мы также можем запросить все блюда, которые любит Сэм, используя:

? - любит (sam, X).
X = paneer_tikka;
X = роти;
X = лапша;
X = hakka_noodles;
X = пицца; < br /> X = спагетти;

Видите ли, мы просто попросили компьютер дать нам значение X, но мы не сказали компьютеру, как получить значение X. Это декларативный способ программирования.

Спасибо за чтение этого блога. Надеюсь, вам понравилась эта серия статей о Парадигмах программирования и вы узнали что-то новое. Если у вас есть какие-либо предложения или вопросы, пожалуйста, добавьте их в комментарий ниже, Happy Learning 👏.

Ещё от меня: