2010-02-18 13 views
27

Entiendo muy claramente la diferencia entre las técnicas de programación funcionales e imperativas. Pero hay una tendencia generalizada a hablar de "lenguajes funcionales", y esto realmente me confunde.La "programación funcional" tiene un significado claro, pero ¿el "lenguaje funcional"?

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

Aún así, incluso como una cuestión de grado, ¿qué significa cuando alguien llama a Scheme un "lenguaje funcional"? La mayoría del código Scheme que veo es imprescindible. ¿Es solo que Scheme hace que sea fácil escribir en un estilo funcional si lo desea? Lo mismo hacen Lua y Python. ¿Son ellos también "idiomas funcionales"?

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

+5

wiki de la comunidad? – jldupont

+11

En realidad, deseo que los niños jugando con Perl/Python/Ruby/C# dejen de etiquetar sus preguntas '' programación funcional' tan pronto como haya una función anónima en la fea pila de signos de puntuación que producen como ejemplo de código. No me interesan sus preguntas, pero algunas de las preguntas que me interesan no tienen más que la etiqueta 'programación funcional' para distinguirlas. Como usted señala, debería ser un lenguaje funcional, pero nadie usa esa etiqueta. –

+3

@Pascal - No estoy de acuerdo por completo. Hay muchas técnicas de programación funcional que son útiles en una variedad de idiomas que no son "lenguajes funcionales puros". Es lo mismo que programar de forma orientada a objetos en un lenguaje que permite múltiples paradigmas. Si le interesan los lenguajes funcionales puros, tal vez debería haber una etiqueta separada para eso ... o buscar las etiquetas para esos idiomas específicos. – RHSeeger

Respuesta

15

Entre las personas que estudian 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 en que:

  • Cualquier lenguaje que se llama funcionales deben apoyar first-class, funciones anidadas con reglas de ámbito léxico.

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

como en idiomas 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 es que los diseñadores quieren a ser llamado "funcional".

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

Idiomas que se llaman "funcional" se tienden a tienen características como la siguiente (tomado de Defining point of functional programming):

  • funciones anónimas (expresiones lambda)
  • recursividad (más prominente como resultado de la pureza)
  • Programación con expresiones en lugar de declaraciones (de nuevo, de pureza)
  • Cierres
  • Currying/aplicación parcial
  • Lazy evaluation
  • Algebraic data types y coincidencia de patrones
  • Parametric polymorphism (aliasgenéricos)

Cuanto más un lenguaje de programación en particular tiene la sintaxis y construcciones adaptada a hacer las varias características de programación antes mencionados fácil/sin dolor para expresar & poner en práctica, es más probable que alguien va a etiquetar como un "lenguaje funcional".

+0

quisiera aceptar un combo de esta respuesta y la de Brian. ¿Debería editar y fusionarlos? – dubiousjim

+0

@profjim: viendo que la respuesta de Brian es un duplicado, podría ser mejor vincularla. O si considera que la duplicación de la información aquí vale la pena, entonces hágalo. De cualquier manera, edítelo hasta que esté contento :-) –

+0

Encontré esta joya: http://conal.net/blog/posts/the-c-language-is-purely-functional/ – dubiousjim

12

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

2

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

1

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.

0

Puede hacer programación de estilo funcional en cualquier idioma. Lo intento tanto como sea posible.

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

Un pura lenguaje funcional como Haskell requiere que usted haga todas sus cálculos matemáticos usando funciones, funciones que no modifican nada, sólo 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 devolución.

+0

Estoy bastante seguro de que Lisp no es un lenguaje funcional puro en ese sentido. Puede modificar valores de variables. – Niki

+1

La mayoría de los Lisp no son puros. Ni Common Lisp ni Scheme lo son. Clojure es el único Lisp puro en el que puedo pensar sin pensarlo. – Chuck

+0

Para agregar a eso, es posible escribir el código de "estilo imperativo" en haskell. Pero en el modelo de mundo de Haskell, se pasa el estado de una declaración a la otra. –

0

Creo que se puede hacer la misma pregunta sobre "lenguajes de OOP". Después de todo, puede escribir programas orientados a objetos en C (y no es raro hacerlo). 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 los "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 características de lenguaje integradas que permitan la programación funcional, como lambdas. (Ignoremos boost :: lambda por el bien del argumento.)

lo tanto, para responder a su pregunta, yo diría que aunque es posible escribir programas de funcionamiento en cada uno de estos idiomas:

  • C no es un lenguaje funcional (no tiene construcciones de lenguaje funcional integradas)
  • 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 suelen denominarse como lenguajes "multi-paradigma".
4

Brian Hurt de Jane Street escribió un very good article en 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. Piensa en qué idiomas se acepta ampliamente que sean funcionales y verás que esta es una definición muy práctica.

Lisp fue un primitivo intento 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 ajustan muy bien a las ideas del cálculo lambda, generalmente se consideran como paradigma mixto o mejor débilmente funcional.

Esta es también la razón por la que mucha gente se molesta en idiomas como Python que se llama funcional. La filosofía general de Python no está relacionada con el cálculo lambda, no fomenta 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 una programación de estilo funcional en Python, sí, pero el lenguaje no tiene sus raíces en la misma matemática que los lenguajes funcionales. (Por cierto, el mismo Guido van Rossum agrees with this description of the language.)

+0

Seguramente si escribo un lenguaje que modele el SKI-cálculo, seguirá siendo funcional. Sí, eso es intertranslatable con el cálculo lambda (sin tipo). Pero también lo es cualquier lenguaje completo de Turing. – dubiousjim

+1

@profjim: el cálculo de SKI se basa en cálculo lambda, así que sí, un lenguaje basado en eso se basaría en el cálculo lambda. Y es cierto que el cálculo lambda equivale a Turing, pero los dos modelos son muy diferentes de un nivel de comprensión humana, que es el dominio en el que funcionan los lenguajes de programación. Su objeción es como señalar que tanto un automóvil como un barco están hechos de átomos similares, por lo que no puede haber ninguna diferencia efectiva entre ellos; es cierto en algunos niveles, pero no en el que normalmente tratamos. – Chuck

+2

Tal vez se lo presentaron de esa manera, pero históricamente se desarrolló de forma independiente (y creo que antes). Estoy de acuerdo en algún sentido intuitivo en que * se ven * más parecidos que en C y el esquema de traducción es más corto en un caso que en el otro. Pero no creo que haya nada más que eso. No estoy diciendo que no haya una diferencia efectiva entre nada, estoy diciendo por qué debería definirse el "modo de transporte" en términos de "modelos de un automóvil" cuando también hay barcos. – dubiousjim

9

Me gusta la respuesta @ Randolpho. En cuanto a características, podría citar la lista aquí:

Defining point of functional programming

saber

  • Pureza (aka inmutabilidad, evitando los efectos secundarios, transparencia referencial)
  • Funciones de orden superior (por ejemplo, pasar una función como parámetro, devolverla a s un resultado, defina la función anónima sobre la marcha como una expresión lambda)
  • Pereza (a.k.a. no estricto evaluación, más útil/utilizable cuando se combina con pureza)
  • tipos de datos algebraicos y coincidencia de patrones
  • Cierres
  • currying/aplicación parcial
  • Polimorfismo paramétrico (aka genéricos)
  • recursividad (más prominente como resultado de la pureza)
  • Programación con expresiones en lugar de declaraciones (de nuevo, de la pureza)

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

+0

desea aceptar un combo de esta respuesta y la de Norman Ramsey. ¿Debería editar y fusionarlos? – dubiousjim

0

Haskell para uno tiene diferentes tipos para las funciones con efectos secundarios y los que no.

Esa es una muy buena propiedad de discriminación por ser un lenguaje 100% funcional, al menos en mi humilde opinión.

0

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é 'funciones' en Haskell son completamente diferentes de 'funciones' en Lisp o Python: http://blog.nihilarchitect.net/archives/289/on-functional-programming/

Cosas como 'map' o 'filter' son en gran parte implementables en C, por ejemplo.

Cuestiones relacionadas