Функциональное программирование Vs Декларативное программирование против императивного программирования

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

Возьмем пример выполнения чисел Фибоначчи.

Императивное программирование:

#include<stdio.h> 
#include<conio.h> 
main() 
{ 
  int n,i,c,a=0,b=1; 
  printf("Enter Fibonacci series of nth term : "); 
  scanf("%d",&n); 
  printf("%d %d ",a,b); 
  for(i=0;i<=(n-3);i++) 
  { 
    c=a+b; 
    a=b; 
    b=c;    
  } 
  printf("%d ",c);
  getch(); 
} 

Декларативное программирование:

Give the nth number and it will return the value of the nth number

Как работает функциональная программа?

Плюс исправьте меня, если мои определения ошибочны. Пожалуйста, не стесняйтесь комментировать..

Ответы

Ответ 1

Пример декларативного программирования выше не является реальной программой, поэтому это не очень хороший пример.

Основное различие между императивным и декларативным. Функциональный - это особый вид декларативного.

C, С++, Java, Javascript, BASIC, Python, Ruby и большинство других языков программирования императив. Как правило, если он имеет явные циклы (for, while, repeat), которые изменяют переменные с явными операциями присваивания в каждом цикле, тогда это необходимо.

SQL и XSLT являются двумя хорошо известными примерами декларативного программирования. Языки разметки, такие как HTML и CSS, также декларативны, хотя они, как правило, недостаточно мощны для описания произвольных алгоритмов.

Вот пример вычисления (суммирование дохода по полу, из подходящего источника данных), сначала написанного на императивном языке (Javascript), а затем в декларативном языке (SQL).

Императивное программирование

var income_m = 0, income_f = 0;
for (var i = 0; i < income_list.length; i++) {
    if (income_list[i].gender == 'M')
        income_m += income_list[i].income;
    else
        income_f += income_list[i].income;
}

Примечание:

  • явная инициализация переменных, которая будет содержать текущие итоги;
  • явный цикл над данными, изменяет управляющую переменную (i) и текущие итоги на каждой итерации;
  • conditionals (if s) используются только для выбора пути кода на каждой итерации.

Декларативное программирование

select gender, sum(income)
from income_list
group by gender;

Примечание:

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

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

Как я уже упоминал выше, SQL case - отличный пример функционального способа программирования, который является ограниченным подмножеством декларативного программирования, в котором требуемое вычисление задается составлением функции.

Функции - это вещи, которые принимают входы и обратные выходы (например, case, sum()...)

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

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

select 
    sum(case when some_flag = 'X' then some_column
        else some_other_column end)
from
    ...

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


Изменить: рекомендую посмотреть некоторые из Anjana Vakil разговоров о функциональном программировании в Javascript, чтобы лучше понять, что это значит.

Ответ 2

Это ошибочное упрощение утверждающее, что императивное программирование отличается от декларативного программирования ошибочным допуском отсутствия заказа в последнем.

Чисто функциональное программирование не препятствует выражению порядка и реализации, а скорее способно выражать случайный случайный порядок на уровне оперативной семантики. Также он имеет преимущество "Не повторяй себя" (DRY), который является формой декларативного стиля (см. Ниже).

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

Ответ 3

Подумайте о c-фильтрах. Где вы читаете stdin и пишите в stdout. Код может быть обязательным, но программа thr используется как функция. Скажем, у вас есть программа ' function, а затем прокладывается к ней:

cat foo  |function |tee bar

Будет фильтровать содержимое функции foo через фильтр tee для записи в stdout и создания bar. Подумайте также о grep и awk, итератор в обоих подразумевается, и они используются как функции.

Ответ 4

Еще одно полезное объяснение, которое я нашел в Pro XAML с С#:

На декларативном

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

На императиве

Императивное программирование является противоположностью декларативного программирования. Если декларативное программирование можно рассматривать как объявление желаемого результата, императивное программирование можно рассматривать как написание строк кода, которые представляют инструкции о том, как достичь желаемого результата.