La guía o código que encontrarás en este artículo es la resolución más sencilla y efectiva que hallamos a tu duda o dilema.
Solución:
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 demás lenguajes de programación son imperativo. Por regla general, si tiene bucles explícitos (por, mientras, repetir) que cambiar variables con operaciones de asignación explícitas en cada ciclo, entonces es imperativo.
SQL y XSLT son dos ejemplos bien conocidos de declarativo programación. 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 cálculo de ejemplo (sumando los ingresos por género, de una fuente de datos adecuada) escrito primero 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;
Aviso:
- explícito inicialización de variables que contendrán los totales acumulados;
- explícito bucle sobre los datos, modificando la variable de control (
i
) y los totales acumulados en cada iteración; - condicionales (
if
s) solo se utilizan para elige la ruta del código en cada iteración.
programación declarativa
select gender, sum(income)
from income_list
group by gender;
Aviso:
- las celdas de memoria que contienen los totales acumulados son implícito por la salida que declaras que quieres;
- cualquier bucle que la CPU necesite realizar (por ejemplo, sobre la tabla income_list) es implícito por la salida que declara que desea y por la estructura de los datos de origen;
- condicionales (ej.
case
en SQL) se utilizan en un funcional manera de especificar el valor de salida desea en función de los valores de entrada, no para elegir una ruta de código.
Programación funcional
Como mencioné anteriormente, SQL case
es un gran ejemplo de la funcional forma de programación, que es un subconjunto restringido de la programación declarativa en la que el cálculo deseado se especifica mediante composición de funciones.
Las funciones son cosas que aceptan entradas y devuelven salidas (ej. case
, sum()
…)
Medios de composición encadenamiento dos o más juntas especificando cómo la salida de una se alimenta como la entrada de la siguiente (típicamente escribiendo una dentro de la otra). Finalmente, toda la composición, que sigue siendo en sí misma una gran función, se aplica a las entradas disponibles para obtener la salida deseada.
En este fragmento estoy declarando la salida que quiero por componer las funcionessum()
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 ese lenguaje es puramente funcional. En esos idiomas, notará la ausencia total de bucles, asignación de variables y otras declaraciones típicamente imperativas.
Editar: recomiendo ver algunos de anjana vakil's charlas sobre programación funcional en Javascript, para tener una mejor idea de lo que se trata.
Es una simplificación excesiva afirmar que la programación imperativa se distingue de la programación declarativa al suponer erróneamente una falta de orden en la última.
No se impide que la programación funcional pura exprese el orden y la implementación, sino que es menos capaz de expresar el orden accidental aleatorio en el nivel de la semántica operativa. También tiene la ventaja de "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.
Otra explicación útil que encontré en Pro XAML con C#:
en declarativo
En la programación declarativa, el código fuente se escribe de manera que exprese el resultado deseado del código con poco o ningún énfasis en la implementación real.
en imperativo
La programación imperativa es lo opuesto a la programación declarativa. Si se puede considerar que la programación declarativa declara cuál es el resultado deseado, la programación imperativa se puede considerar como escribir líneas de código que representan las instrucciones sobre cómo lograr el resultado deseado.
Puedes añadir valor a nuestro contenido informacional añadiendo tu experiencia en las notas.