terminology

terminology - Programación Funcional Vs Programación Declarativa Vs Programación Imperativa



terminology synonym (3)

He estado demasiado acostumbrado a la programación imperativa, que es la forma habitual de decirle a la computadora que realice el procedimiento paso a paso para obtener el resultado final. Por otro lado, la programación declarativa simplemente pasa la entrada y espera la salida sin indicar el procedimiento cómo se realiza. Estoy confundido acerca de la Programación Funcional. Sé que la programación funcional es un paradigma de programación que trata la computación como la evaluación de funciones matemáticas y evita el estado y los datos mutables, y no es un tipo de lenguaje declarativo. Sin embargo, todavía no puedo comprender cómo puede funcionar.

Tomemos un ejemplo de la ejecución de los números de Fibonacci.

Programación imperativa:

#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(); }

Programación declarativa:

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

¿Cómo funciona el programa funcional?

Además, corrígeme si mis definiciones están equivocadas. Por favor, siéntase libre de comentar ...


Es una simplificación errónea afirmar que la programación imperativa se distingue de la programación declarativa al asumir erróneamente una falta de orden en esta última.

No se impide que la programación funcional pura exprese orden e implementación, sino que es menos capaz de expresar orden aleatorio accidental en el nivel de semántica operacional. También tiene la ventaja de que "No te repitas" (DRY), que es una forma de estilo declarativo (ver más abajo).

Sin embargo, la programación funcional pura no garantiza una semántica declarativa de alto nivel. Para ello, debe aplicar la definición correcta de declarativo frente a imperativo .


Piensa en c filtros. Donde lees desde stdin y escribes a stdout. El código puede ser imperativo, pero el programa se usa como una función. Supongamos que tiene una función de programa, y ​​luego diríjase a ella:

cat foo |function |tee bar

Filtrará el contenido de foo a través de la función y luego a través del filtro en T para escribir en la salida estándar y crear una barra . Piense también en grep y awk, el iterador en ambos está implícito y se usan como funciones.


Su ejemplo de programación declarativa anterior no es un programa real, por lo que no es un buen ejemplo.

La principal diferencia es entre imperativo y declarativo. Funcional es un tipo particular de declarativo.

C, C ++, Java, Javascript, BASIC, Python, Ruby y la mayoría de los otros lenguajes de programación son imperativos . Como regla general, si tiene bucles explícitos (para, mientras se repiten) que cambian las variables con operaciones de asignación explícitas en cada bucle, entonces es imperativo.

SQL y XSLT son dos ejemplos bien conocidos de programación declarativa . Los lenguajes de marcado como HTML y CSS también son declarativos, aunque por lo general no son lo suficientemente poderosos para describir algoritmos arbitrarios.

Aquí hay un ejemplo de cálculo (sumando el ingreso por género, de una fuente de datos adecuada), primero escrito en un lenguaje imperativo (Javascript) y luego en un lenguaje declarativo (SQL).

Programación imperativa

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; }

Darse cuenta:

  • inicialización explícita de variables que contendrán los totales acumulados;
  • bucle explícito sobre los datos, modificando la variable de control ( i ) y los totales acumulados en cada iteración;
  • los condicionales ( if s) solo se utilizan para elegir la ruta del código en cada iteración.

Programación declarativa

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

Darse cuenta:

  • las celdas de memoria que contienen los totales acumulados están implícitas en la salida que declara que desea;
  • cualquier bucle que deba realizar la CPU (por ejemplo, sobre la tabla de lista de ingresos) está implícito en la salida que declara que desea y en la estructura de los datos de origen;
  • los condicionales (por ejemplo, el case en SQL) se utilizan de manera funcional para especificar el valor de salida que desea en función de los valores de entrada, no para elegir una ruta de código.

Programacion funcional

Como mencioné anteriormente, el case de SQL es un gran ejemplo de la forma funcional de la programación, que es un subconjunto restringido de la programación declarativa en el que las funciones de composición especifican el cálculo deseado.

Las funciones son cosas que aceptan entradas y devuelven salidas (por ejemplo, case , sum() …)

Composición significa encadenar dos o más juntos especificando cómo se alimenta la salida de uno como entrada al siguiente (generalmente escribiendo uno dentro del otro). Finalmente, toda la composición, que todavía es en sí misma una función importante, se aplica al Entradas para obtener la salida deseada.

En este fragmento estoy declarando la salida que quiero al componer las funciones sum() y case . Esto se llama programación funcional:

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

Si la composición de dos o más funciones y su aplicación a los datos de entrada son las únicas construcciones disponibles en un lenguaje dado, se dice que el lenguaje es puramente funcional . En esos idiomas notará la ausencia completa de bucles, asignación de variables y otras declaraciones típicamente imperativas.

Edición: Recomiendo ver algunas de las charlas de Anjana Vakil sobre programación funcional en Javascript, para tener una mejor idea de qué se trata.