Paradigma de programación funcional

Introducción 
La programación funcional es un paradigma de programación en el que tratamos de vincular todo en el estilo de funciones matemáticas puras. Es un tipo declarativo de estilo de programación. Su enfoque principal está en «qué resolver» en contraste con un estilo imperativo donde el enfoque principal es «cómo resolver». Utiliza expresiones en lugar de declaraciones. Una expresión se evalúa para producir un valor, mientras que una instrucción se ejecuta para asignar variables. Esas funciones tienen algunas características especiales que se analizan a continuación. 

La programación funcional se basa en Lambda Calculus: 
Lambda calculus es un marco desarrollado por Alonzo Church para estudiar cálculos con funciones. Se puede llamar como el lenguaje de programación más pequeño del mundo. Da la definición de lo que es computable. Cualquier cosa que pueda calcularse mediante el cálculo lambda es computable. Es equivalente a la máquina de Turing en su capacidad de cálculo. Proporciona un marco teórico para describir funciones y su evaluación. Forma la base de casi todos los lenguajes de programación funcionales actuales. 
Realidad: Alan Turing fue un estudiante de Alonzo Church que creó la máquina de Turing que sentó las bases del estilo de programación imperativa. 

Lenguajes de programación que admiten programación funcional: Haskell, JavaScript, Python, Scala, Erlang, Lisp, ML, Clojure, OCaml, Common Lisp, Racket. 

Conceptos de programación funcional: 

  • Funciones puras
  • recursividad
  • Transparencia referencial
  • Las funciones son de primera clase y pueden ser de orden superior
  • Las variables son inmutables

Funciones puras: Estas funciones tienen dos propiedades principales. Primero, siempre producen el mismo resultado para los mismos argumentos independientemente de cualquier otra cosa. 
En segundo lugar, no tienen efectos secundarios, es decir, no modifican ningún argumento ni variables locales/globales ni flujos de entrada/salida. 
La propiedad posterior se llama inmutabilidad. El único resultado de la función pura es el valor que devuelve. Son deterministas. 
Los programas realizados mediante programación funcional son fáciles de depurar porque las funciones puras no tienen efectos secundarios ni E/S ocultas. Las funciones puras también facilitan la escritura de aplicaciones paralelas/concurrentes. Cuando el código está escrito en este estilo, un compilador inteligente puede hacer muchas cosas: puede paralelizar las instrucciones, esperar para evaluar los resultados cuando los necesite y memorizar los resultados, ya que los resultados nunca cambian mientras la entrada no cambie. 
ejemplo de la función pura: 

sum(x, y)           // sum is function taking x and y as arguments
    return x + y    // sum is returning sum of x and y without changing them

Recursividad: no hay bucles «for» o «while» en los lenguajes funcionales. La iteración en lenguajes funcionales se implementa mediante recursividad. Las funciones recursivas se llaman a sí mismas repetidamente, hasta llegar al caso base. 
ejemplo de la función recursiva:  

fib(n)
    if (n <= 1)
        return 1;
    else
        return fib(n - 1) + fib(n - 2);

Transparencia referencial: En los programas funcionales las variables una vez definidas no cambian su valor a lo largo del programa. Los programas funcionales no tienen sentencias de asignación. Si tenemos que almacenar algún valor, definimos nuevas variables en su lugar. Esto elimina cualquier posibilidad de efectos secundarios porque cualquier variable se puede reemplazar con su valor real en cualquier punto de ejecución. El estado de cualquier variable es constante en cualquier instante. 

Ejemplo:  

x = x + 1 // this changes the value assigned to the variable x.
          // So the expression is not referentially transparent. 

Las funciones son de primera clase y pueden ser de orden superior: las funciones de primera clase se tratan como variables de primera clase. Las variables de primera clase se pueden pasar a funciones como parámetro, se pueden devolver desde funciones o se pueden almacenar en estructuras de datos. Las funciones de orden superior son las funciones que toman otras funciones como argumentos y también pueden devolver funciones. 

Ejemplo: 

show_output(f)            // function show_output is declared taking argument f 
                          // which are another function
    f();                  // calling passed function

print_gfg()             // declaring another function 
    print("hello gfg");

show_output(print_gfg)  // passing function in another function

Las variables son inmutables: en la programación funcional, no podemos modificar una variable después de haberla inicializado. Podemos crear nuevas variables, pero no podemos modificar las existentes, y esto realmente ayuda a mantener el estado durante el tiempo de ejecución de un programa. Una vez que creamos una variable y establecemos su valor, podemos tener plena confianza sabiendo que el valor de esa variable nunca cambiará.  

Ventajas y desventajas de la programación funcional

ventajas:  

  1. Las funciones puras son más fáciles de entender porque no cambian ningún estado y dependen solo de la entrada que se les da. Cualquier salida que produzcan es el valor de retorno que dan. Su firma de función brinda toda la información sobre ellos, es decir, su tipo de devolución y sus argumentos.
  2. La capacidad de los lenguajes de programación funcional para tratar funciones como valores y pasarlas a funciones como parámetros hace que el código sea más legible y fácilmente comprensible.
  3. La prueba y la depuración son más fáciles. Dado que las funciones puras solo toman argumentos y producen salida, no producen ningún cambio, no toman entrada ni producen alguna salida oculta. Usan valores inmutables, por lo que se vuelve más fácil verificar algunos problemas en programas escritos que usan funciones puras.
  4. Se usa para implementar concurrencia/paralelismo porque las funciones puras no cambian las variables ni ningún otro dato fuera de ellas.
  5. Adopta una evaluación perezosa que evita la evaluación repetida porque el valor se evalúa y almacena solo cuando se necesita.

Desventajas:  

  1. A veces, escribir funciones puras puede reducir la legibilidad del código.
  2. Escribir programas en estilo recursivo en lugar de usar bucles puede ser un poco intimidante.
  3. Escribir funciones puras es fácil, pero combinarlas con el resto de la aplicación y las operaciones de E/S es una tarea difícil.
  4. Los valores inmutables y la recursividad pueden provocar una disminución del rendimiento.

Aplicaciones: 

  • Se utiliza en cálculos matemáticos.
  • Es necesario cuando se requiere concurrencia o paralelismo.

Realidad: Whatsapp solo necesita 50 ingenieros para sus 900 millones de usuarios porque Erlang se usa para implementar sus necesidades de concurrencia. Facebook utiliza Haskell en su sistema antispam. 

Publicación traducida automáticamente

Artículo escrito por Vishalxviii y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *