La programación funcional es un paradigma de programación que se basa en la evaluación de funciones matemáticas y en la composición de éstas para crear programas. En lugar de utilizar cambios de estado y mutación de datos, como ocurre en la programación imperativa, la programación funcional se basa en el uso de funciones puras, es decir, funciones que no tienen efectos secundarios y siempre devuelven el mismo resultado dado el mismo argumento.
Esto hace que los programas funcionales sean más fáciles de probar y depurar, ya que no hay que preocuparse por el estado del programa en un momento dado. Algunos lenguajes de programación que utilizan el paradigma funcional incluyen Lisp, Haskell y ML.
La programación funcional tiene algunos beneficios clave:
- Mayor facilidad de lectura y mantenimiento: Los programas funcionales suelen ser más cortos y más fáciles de leer y comprender que los programas imperativos, ya que no hay que preocuparse por el estado del programa y cómo cambia con el tiempo.
- Mayor facilidad de prueba y depuración: Como las funciones puras no tienen efectos secundarios, es más fácil probar y depurar programas funcionales, ya que siempre sabes qué obtienes dado un conjunto de argumentos.
- Mayor facilidad de paralelización: Debido a que las funciones puras no tienen efectos secundarios, es más fácil paralelizar el código funcional, ya que no hay que preocuparse por los efectos que tendría en el estado del programa.
- Mayor facilidad de reutilización: Las funciones puras son más fáciles de reutilizar en diferentes contextos, ya que no tienen efectos secundarios y siempre devuelven el mismo resultado dado el mismo argumento.
- Mayor seguridad: Como las funciones puras no tienen efectos secundarios, es más difícil introducir errores en el código funcional, lo que puede llevar a una mayor seguridad del programa.
Ejemplos simples de código funcional en el lenguaje de programación Haskell:
-- Esta es una función que toma dos argumentos y devuelve su suma
sumar :: Int -> Int -> Int
sumar x y = x + y
-- Esta es una función que toma una lista y devuelve su longitud
longitud :: [a] -> Int
longitud [] = 0
longitud (x:xs) = 1 + longitud xs
-- Esta es una función que toma una lista y devuelve una nueva lista con cada elemento duplicado
duplicar :: [a] -> [a]
duplicar [] = []
duplicar (x:xs) = x:x:duplicar xs
Ejemplos de código funcional en el lenguaje de programación Lisp:
;; Esta es una función que toma dos argumentos y devuelve su suma
(defun sumar (x y)
(+ x y))
;; Esta es una función que toma una lista y devuelve su longitud
(defun longitud (lista)
(cond ((null lista) 0)
(t (+ 1 (longitud (cdr lista))))))
;; Esta es una función que toma una lista y devuelve una nueva lista con cada elemento duplicado
(defun duplicar (lista)
(cond ((null lista) '())
(t (cons (car lista) (cons (car lista) (duplicar (cdr lista)))))))
Ejemplos de código funcional en el lenguaje de programación ML:
- Programa que suma dos números enteros y devuelve el resultado:
fun suma(x:int, y:int) = x + y;
print(suma(5,7));
Output: 12
- Programa que determina si un número es par o no:
fun es_par(x:int) = if x mod 2 = 0 then true else false;
print(es_par(5));
print(es_par(6));
Output: false, true
- Programa que aplica una función a cada elemento de una lista:
fun aplicar_funcion(f:int->int, lst:int list) =
map f lst;
fun cuadrado(x:int) = x*x;
print(aplicar_funcion(cuadrado, [1,2,3,4,5]));
Output: [1,4,9,16,25]