Programación funcional: principios, características y orígenes históricos

Documento de Universidad sobre Programación funcional. El Pdf explora el paradigma de la programación funcional, sus orígenes históricos con Lisp y el Lambda Cálculo, y los tipos de datos compuestos en Scheme, como la función 'cons' y las funciones de acceso 'car' y 'cdr', para la materia de Informática.

Ver más

54 páginas

2/2/25, 21:55
Tema 2: Programación funcional - LPP
https://domingogallardo.github.io/apuntes-lpp/teoria/tema02-programacion-funcional/tema02-programacion-funcional.html
1/54
Tema 2: Programación funcional
1. El paradigma de Programación Funcional
1.1. Pasado y presente del paradigma funcional
1.1.1. Denición y características
En una denición muy breve y concisa la programación funcional dene un
programa
de la
siguiente forma:
En programación funcional un programa es un conjunto de funciones matemáticas que
convierten unas entradas en unas salidas, sin ningún estado interno y ningún efecto lateral.
Hablaremos más adelante de la no existencia de estado interno (variables en las que se
guardan y se modican valores) y de la ausencia de efectos laterales. Avancemos que estas
son también características de la
programación declarativa
(frente a la programación
tradicional imperativa que es la que se utiliza en lenguajes como C o Java). En este sentido, la
programación funcional es un tipo concreto de programación declarativa.
Las características principales del paradigma funcional son:
Deniciones de funciones matemáticas puras, sin estado interno ni efectos laterales
Valores inmutables
Uso profuso de la recursión en la denición de las funciones
Uso de listas como estructuras de datos fundamentales
Funciones como tipos de datos primitivos: expresiones lambda y funciones de orden
superior
Explicaremos estas propiedades a continuación.
1.1.2. Orígenes históricos
En los años 30, junto con la máquina de Turing, se propusieron distintos modelos
computacionales equivalentes que formalizaban el concepto de
algoritmo
. Uno de estos
modelos fue el denominado
Cálculo lambda
propuesto por Alonzo Church en los años 30 y
basado en la evaluación de expresiones matemáticas. En este formalismo los algoritmos se
expresan mediante funciones matemáticas en las que puede ser usada la recursión. Una
Denición de programa funcional
2/2/25, 21:55
Tema 2: Programación funcional - LPP
https://domingogallardo.github.io/apuntes-lpp/teoria/tema02-programacion-funcional/tema02-programacion-funcional.html
2/54
función matemática recibe parámetros de entrada y devuelve un valor. La evaluación de la
función se realiza evaluando sus expresiones matemáticas mediante la sustitución de los
parámetros formales por los valores reales que se utilizan en la invocación (el denominado
modelo de sustitución
que veremos más adelante).
El cálculo lambda es un formalismo matemático, basado en operaciones abstractas. Dos
décadas después, cuando los primeros computadores electrónicos estaban empezando a
utilizarse en grandes empresas y en universidades, este formalismo dio origen a algo mucho
más tangible y práctico: un lenguaje de alto nivel, mucho más expresivo que el ensamblador,
con el que expresar operaciones y funciones
que pueden ser denidas y evaluadas en el
computador
, el lenguaje de programación Lisp.
1.1.3. Historia y características del Lisp
Lisp es el primer lenguaje de programación de alto nivel basado en el paradigma funcional.
Creado en 1958 por John McCarthy.
Lisp fue en su época un lenguaje revolucionario que introdujo nuevos conceptos de
programación no existentes entonces: funciones como objetos primitivos, funciones de
orden superior, polimorsmo, listas, recursión, símbolos, homogeneidad de datos y
programas, bucle REPL (
Read-Eval-Print Loop
)
La herencia del Lisp llega a lenguajes derivados de él (Scheme, Golden Common Lisp) y a
nuevos lenguajes de paradigmas no estrictamente funcionales, como C#, Python, Ruby,
Objective-C o Scala.
Lisp fue el primer lenguaje de programación interpretado, con muchas características
dinámicas que se ejecutan en tiempo de ejecución (
run-time
). Entre estas características
podemos destacar la gestión de la memoria (creación y destrucción
automática
de memoria
reservada para datos), la detección de excepciones y errores en tiempo de ejecución o la
creación en tiempo de ejecución de funciones anónimas (expresiones
lambda
). Todas estas
características se ejecutan mediante un
sistema de tiempo de ejecución
(
runtime system
)
presente en la ejecución de los programas. A partir del Lisp muchos otros lenguajes han usado
estas características de interpretación o de sistemas de tiempo de ejecución. Por ejemplo,
lenguajes como BASIC, Python, Ruby o JavaScript son lenguajes interpretados. Y lenguajes
como Java o C# tienen una avanzada plataforma de tiempo de ejecución con soporte para la
gestión de la memoria dinámica (
recolección de basura
,
garbage collection
) o la compilación
just in time
.
Lisp no es un lenguaje exclusivamente funcional. Lisp se diseñó con el objetivo de ser un
lenguaje de alto nivel capaz de resolver problemas prácticos de Inteligencia Articial, no con la
idea de ser un lenguaje formal basado un único modelo de computación. Por ello en Lisp (y en
Scheme) existen primitivas que se salen del paradigma funcional puro y permiten programar
de formar imperativa (no declarativa), usando mutación de estado y pasos de ejecución.

Visualiza gratis el PDF completo

Regístrate para acceder al documento completo y transformarlo con la IA.

Vista previa

Tema 2: Programación funcional - LPP

El paradigma de Programación Funcional

Pasado y presente del paradigma funcional

Definición y características

En una definición muy breve y concisa la programación funcional define un programa de la siguiente forma:

" Definición de programa funcional En programación funcional un programa es un conjunto de funciones matemáticas que convierten unas entradas en unas salidas, sin ningún estado interno y ningún efecto lateral.

Hablaremos más adelante de la no existencia de estado interno (variables en las que se guardan y se modifican valores) y de la ausencia de efectos laterales. Avancemos que estas son también características de la programación declarativa (frente a la programación tradicional imperativa que es la que se utiliza en lenguajes como C o Java). En este sentido, la programación funcional es un tipo concreto de programación declarativa.

Las características principales del paradigma funcional son:

  • Definiciones de funciones matemáticas puras, sin estado interno ni efectos laterales
  • Valores inmutables
  • Uso profuso de la recursion en la definición de las funciones
  • Uso de listas como estructuras de datos fundamentales
  • Funciones como tipos de datos primitivos: expresiones lambda y funciones de orden superior

Explicaremos estas propiedades a continuación.

Orígenes históricos

En los años 30, junto con la máquina de Turing, se propusieron distintos modelos computacionales equivalentes que formalizaban el concepto de algoritmo. Uno de estos modelos fue el denominado Cálculo lambda propuesto por Alonzo Church en los años 30 y basado en la evaluación de expresiones matemáticas. En este formalismo los algoritmos se expresan mediante funciones matemáticas en las que puede ser usada la recursión. Una https://domingogallardo.github.io/apuntes-lpp/teoria/tema02-programacion-funcional/tema02-programacion-funcional.html 1/542/2/25, 21:55 Tema 2: Programación funcional - LPP función matemática recibe parámetros de entrada y devuelve un valor. La evaluación de la función se realiza evaluando sus expresiones matemáticas mediante la sustitución de los parámetros formales por los valores reales que se utilizan en la invocación (el denominado modelo de sustitución que veremos más adelante).

El cálculo lambda es un formalismo matemático, basado en operaciones abstractas. Dos décadas después, cuando los primeros computadores electrónicos estaban empezando a utilizarse en grandes empresas y en universidades, este formalismo dio origen a algo mucho más tangible y práctico: un lenguaje de alto nivel, mucho más expresivo que el ensamblador, con el que expresar operaciones y funciones que pueden ser definidas y evaluadas en el computador, el lenguaje de programación Lisp.

Historia y características del Lisp
  • Lisp es el primer lenguaje de programación de alto nivel basado en el paradigma funcional.
  • Creado en 1958 por John McCarthy.
  • Lisp fue en su época un lenguaje revolucionario que introdujo nuevos conceptos de programación no existentes entonces: funciones como objetos primitivos, funciones de orden superior, polimorfismo, listas, recursión, símbolos, homogeneidad de datos y programas, bucle REPL (Read-Eval-Print Loop)
  • La herencia del Lisp llega a lenguajes derivados de él (Scheme, Golden Common Lisp) y a nuevos lenguajes de paradigmas no estrictamente funcionales, como C#, Python, Ruby, Objective-C o Scala.

Lisp fue el primer lenguaje de programación interpretado, con muchas características dinámicas que se ejecutan en tiempo de ejecución (run-time). Entre estas características podemos destacar la gestión de la memoria (creación y destrucción automática de memoria reservada para datos), la detección de excepciones y errores en tiempo de ejecución o la creación en tiempo de ejecución de funciones anónimas (expresiones lambda). Todas estas características se ejecutan mediante un sistema de tiempo de ejecución (runtime system) presente en la ejecución de los programas. A partir del Lisp muchos otros lenguajes han usado estas características de interpretación o de sistemas de tiempo de ejecución. Por ejemplo, lenguajes como BASIC, Python, Ruby o JavaScript son lenguajes interpretados. Y lenguajes como Java o C# tienen una avanzada plataforma de tiempo de ejecución con soporte para la gestión de la memoria dinámica (recolección de basura, garbage collection) o la compilación just in time.

Lisp no es un lenguaje exclusivamente funcional. Lisp se diseñó con el objetivo de ser un lenguaje de alto nivel capaz de resolver problemas prácticos de Inteligencia Artificial, no con la idea de ser un lenguaje formal basado un único modelo de computación. Por ello en Lisp (y en Scheme) existen primitivas que se salen del paradigma funcional puro y permiten programar de formar imperativa (no declarativa), usando mutación de estado y pasos de ejecución. https://domingogallardo.github.io/apuntes-lpp/teoria/tema02-programacion-funcional/tema02-programacion-funcional.html 2/542/2/25, 21:55 Tema 2: Programación funcional - LPP Sin embargo, durante la primera parte de la asignatura en la que estudiaremos la programación funcional, no utilizaremos las instrucciones imperativas de Scheme sino que escribiremos código exclusivamente funcional.

Lenguajes de programación funcional

En los años 60 la programación funcional definida por el Lisp fue dominante en departamentos de investigación en Inteligencia Artificial (MIT por ejemplo). En los años 70, 80 y 90 se fue relegando cada vez más a los nichos académicos y de investigación; en la empresa se impusieron los lenguajes imperativos y orientados a objetos.

En la primera década del 2000 han aparecido lenguajes que evolucionan de Lisp y que resaltan sus aspectos funcionales, aunque actualizando su sintaxis. Destacamos entre ellos:

  • Clojure
  • Erlang

También hay una tendencia desde mediados de la década de 2000 de incluir aspectos funcionales como las expresiones lambda o las funciones de orden superior en lenguajes imperativos orientados a objetos, dando lugar a lenguajes multi-paradigma:

  • Ruby
  • Python
  • Groovy
  • Scala
  • Swift

Por último, en la década del 2010 también se ha hecho popular un lenguaje exclusivamente funcional como Haskell. Este lenguaje, a diferencia de Scheme y de otros lenguajes multi- paradigma, no tienen ningún elemento imperativo y consigue que todas sus expresiones sean puramente funcionales.

Aplicaciones prácticas de la programación funcional

En la actualidad el paradigma funcional es un paradigma de moda, como se puede comprobar observando la cantidad de artículos, charlas y blogs en los que se habla de él, así como la cantidad de lenguajes que están aplicando sus conceptos. Por ejemplo, solo como muestra, a continuación puedes encontrar algunos enlaces a charlas y artículos interesantes publicados recientemente sobre programación funcional:

  • Lupo Montero - Introducción a la programación funcional en JavaScript (Blog)
  • Andrés Marzal - Por qué deberías aprender programación funcional ya mismo (Charla en YouTube)
  • Mary Rose Cook - A practical introduction to functional programming (Blog) https://domingogallardo.github.io/apuntes-lpp/teoria/tema02-programacion-funcional/tema02-programacion-funcional.html 3/542/2/25, 21:55 Tema 2: Programación funcional - LPP
  • Ben Christensen - Functional Reactive Programming in the Netflix API (Charla en InfoQ)

El auge reciente de estos lenguajes y del paradigma funcional se debe a varios factores, entre ellos que es un paradigma que facilita:

  • la programación de sistemas concurrentes, con múltiples hilos de ejecución o con múltiples computadores ejecutando procesos conectados concurrentes.
  • la definición y composición de múltiples operaciones sobre streams de forma muy concisa y compacta, aplicable a la programación de sistemas distribuidos en Internet.
  • la programación interactiva y evolutiva.
PROGRAMACIÓN DE SISTEMAS CONCURRENTES

Veremos más adelante que una de las características principales de la programación funcional es que no se usa la mutación (no se modifican los valores asignados a variables ni parámetros). Esta propiedad lo hace un paradigma excelente para implementar programas concurrentes, en los que existen múltiples hilos de ejecución. La programación de sistemas concurrentes es muy complicada con el paradigma imperativo tradicional, en el que la modificación del estado de una variable compartida por más de un hilo puede provocar condiciones de carrera y errores difícilmente localizables y reproducibles.

Como dice Bartosz Milewski, investigador y teórico de ciencia de computación, en su respuesta en Quora a la pregunta ¿por qué a los ingenieros de software les gusta la programación funcional ?:

" Bartosz Milewski: ¿ Por que es popular la programación funcional? Porque es la única forma práctica de escribir programas concurrentes. Intentar escribir programas concurrentes en lenguajes imperativos, no sólo es difícil, sino que lleva a bugs que son muy difíciles de descubrir, reproducir y arreglar. En los lenguajes imperativos y, en particular, en los lenguajes orientados a objetos se ocultan las mutaciones y se comparten datos sin darse cuenta, por lo que son extremadamente propensos a los errores de concurrencia producidos por las condiciones de carrera.

DEFINICIÓN Y COMPOSICIÓN DE OPERACIONES SOBRE STREAMS

El paradigma funcional ha originado un estilo de programación sobre streams de datos, en el que se concatenan operaciones como filter o map para definir de forma sencilla procesos y transformaciones asíncronas aplicables a los elementos del stream. Este estilo de programación ha hecho posible nuevas ideas de programación, como la programación reactiva, basada en eventos, o los futuros o promesas muy utilizados en lenguajes muy populares como JavaScript para realizar peticiones asíncronas a servicios web. https://domingogallardo.github.io/apuntes-lpp/teoria/tema02-programacion-funcional/tema02-programacion-funcional.html 4/54

¿Non has encontrado lo que buscabas?

Explora otros temas en la Algor library o crea directamente tus materiales con la IA.