significado que programing paradigma language functional-programming scheme

functional-programming - que - scheme programing language



"Programación funcional" tiene un significado claro, pero ¿"lenguaje funcional"? (10)

Brian Hurt de Jane Street escribió un muy buen artículo sobre esto hace un tiempo. La definición básica a la que llegó es que un lenguaje de programación funcional es un lenguaje que modela el cálculo lambda . Piense en qué idiomas están ampliamente acordados para ser funcionales y verá que esta es una definición muy práctica.

Lisp fue un intento primitivo de modelar el cálculo lambda, por lo que se ajusta a esta definición, aunque como la mayoría de las implementaciones no se adhieren a las ideas del cálculo lambda, en general se consideran paradigma mixto o, en el mejor de los casos, débilmente funcionales.

Esta es también la razón por la que muchas personas se molestan con lenguajes como Python que se llaman funcionales. La filosofía general de Python no está relacionada con el cálculo lambda (no alienta esta forma de pensar), por lo que no es un lenguaje funcional. Es una máquina de Turing con funciones de primera clase. Puede hacer programación de estilo funcional en Python, sí, pero el lenguaje no tiene sus raíces en las mismas matemáticas que los lenguajes funcionales. (Por cierto, el propio Guido van Rossum está de acuerdo con esta descripción del lenguaje ).

Entiendo muy claramente la diferencia entre técnicas de programación funcionales e imperativas. Pero hay una tendencia generalizada a hablar de "lenguajes funcionales", y esto realmente me confunde.

Por supuesto, algunos lenguajes como Haskell son más hospitalarios para la programación funcional que otros lenguajes como C. Pero incluso el primero hace E / S (solo lo mantiene en un gueto). Y puedes escribir programas funcionales en C (es absurdamente más difícil). Así que tal vez es sólo una cuestión de grado.

Aún así, incluso como cuestión de grado, ¿qué significa cuando alguien llama a Scheme un "lenguaje funcional"? La mayoría del código de esquema que veo es imperativo. ¿Es solo que Scheme facilita la escritura en un estilo funcional si lo desea? Lo mismo ocurre con Lua y Python. ¿Son también "lenguajes funcionales"?

No estoy tratando de ser un policía de idiomas. Si esto es solo una forma suelta de hablar, está bien. Solo estoy tratando de averiguar si tiene algún significado definido (incluso si es un significado de grado) que no estoy viendo.


Creo que se puede hacer la misma pregunta sobre "OOP languages". Después de todo, puede escribir programas orientados a objetos en C (y no es raro que lo haga). Pero C no tiene construcciones de lenguaje integradas para habilitar OOP. Tienes que hacer OOP "a mano" sin mucha ayuda del compilador. Es por eso que generalmente no se considera un lenguaje OOP. Creo que esta distinción también se puede aplicar a "lenguajes funcionales": por ejemplo, no es raro escribir código funcional en C ++ (piense en funciones STL como std::count_if o std::transform ). Pero C ++ (por ahora) carece de funciones de lenguaje integradas que permiten la programación funcional, como las lambdas. (Ignoremos boost :: lambda por el bien del argumento.)

Entonces, para responder a su pregunta, diría que aunque es posible escribir programas de función en cada uno de estos idiomas:

  • C no es un lenguaje funcional (no hay construcciones de lenguaje funcional incorporadas)
  • Scheme, Python y sus amigos tienen construcciones funcionales, por lo que son lenguajes funcionales. Pero también tienen construcciones imperativas y OOP, por lo que generalmente se las denomina lenguajes "multi-paradigma".

Entre las personas que estudian los lenguajes de programación para ganarse la vida, el "lenguaje de programación funcional" es un término bastante débil. Existe un fuerte consenso de que:

  • Cualquier lenguaje que se llame a sí mismo funcional debe admitir funciones anidadas de first-class con reglas de alcance léxicas .

Una minoría significativa también reserva el término "lenguaje funcional" para los idiomas que son:

como en lenguajes como Agda, Clean, Coq y Haskell.

Más allá de eso, lo que se considera un lenguaje de programación funcional es a menudo una cuestión de intención , es decir, si los diseñadores quieren que se llame "funcional".

Perl y Smalltalk son ejemplos de lenguajes que admiten funciones de primera clase pero cuyos diseñadores no los llaman funcionales. Objective Caml es un ejemplo de un lenguaje que se llama funcional aunque tiene un sistema de objetos completo con herencia y todo.

Los lenguajes que se llaman "funcionales" tienden a tener características como las siguientes (tomadas de Definir el punto de la programación funcional ):

  • Funciones anónimas (expresiones lambda)
  • Recursión (más prominente como resultado de la pureza)
  • Programación con expresiones en lugar de declaraciones (nuevamente, desde la pureza)
  • Cierres
  • Currying / aplicación parcial
  • Evaluación perezosa
  • Tipos de datos algebraicos y coincidencia de patrones
  • Polimorfismo paramétrico (también conocido como genéricos )

Cuanto más un lenguaje de programación en particular tenga sintaxis y construcciones adaptadas para hacer que las diversas funciones de programación enumeradas anteriormente sean fáciles / fáciles de expresar y de implementar, es más probable que alguien las etiquete como "lenguaje funcional".


Haskell para uno tiene diferentes tipos para funciones con efectos secundarios y sin efectos.

Esa es una propiedad discriminatoria bastante buena por ser un lenguaje 100% funcional, al menos IMHO.


Me gusta la respuesta de @Randolpho. Con respecto a las características, podría citar la lista aquí:

Definición del punto de programación funcional.

a saber

  • Pureza (también conocida como inmutabilidad , evitación de efectos secundarios, transparencia referencial )
  • Funciones de orden superior (por ejemplo, pase una función como parámetro, devuélvala como resultado, defina la función anónima sobre la marcha como una expresión lambda)
  • La pereza (también conocida como evaluación no estricta , más útil / utilizable cuando se combina con la pureza)
  • Tipos de datos algebraicos y coincidencia de patrones
  • Cierres
  • Currying / aplicación parcial
  • Polimorfismo paramétrico (también conocido como genéricos )
  • Recursión (más prominente como resultado de la pureza)
  • Programación con expresiones en lugar de declaraciones (nuevamente, desde la pureza)

Cuanto más un lenguaje de programación en particular tenga sintaxis y construcciones adaptadas para hacer que las diversas características de PF enumeradas anteriormente sean fáciles / fáciles de expresar y de implementar, es más probable que alguien las etiquete como "lenguaje funcional".


Puedes realizar programación de estilo funcional en cualquier idioma. Intento lo más posible.

Python, Linq promueven la programación de estilo funcional.

Un lenguaje funcional puro como Haskell requiere que hagas todos tus cálculos usando funciones matemáticas , funciones que no modifican nada, simplemente devuelven valores.

Además, los lenguajes funcionales normalmente le permiten escribir funciones de orden superior, funciones que toman funciones como argumentos y / o tipos de retorno.


Un lenguaje (y plataforma) que promueve la Programación Funcional como un medio para aprovechar al máximo las capacidades de dicha plataforma.


Un lenguaje que hace que sea mucho más difícil crear funciones con efectos secundarios que sin efectos secundarios. Lo mismo cuenta para estructuras de datos mutables / inmutables.


Una vez escribí un análisis (bastante largo) sobre por qué el término ''lenguaje de programación funcional'' no tiene sentido y también trata de explicar por qué, por ejemplo, las ''funciones'' en Haskell son completamente diferentes de las ''funciones'' en Lisp o Python: http://blog.nihilarchitect.net/archives/289/on-functional-programming/

Cosas como ''mapa'' o ''filtro'' son, en gran parte, implementables en C, por ejemplo.


Yo diría que un lenguaje funcional es cualquier lenguaje que permita la programación funcional sin dolor excesivo.