2009-07-11 17 views
49

En la programación orientada a objetos, podríamos decir los conceptos básicos son:¿Cuáles son los conceptos básicos en la programación funcional?

  1. encapsulación
  2. herencia, polimorfismo

Qué sería eso en la programación funcional?

+12

¿Por qué cree que esos son los conceptos fundamentales de la programación orientada a objetos? Muchos lenguajes OO no tienen encapsulado (por ejemplo, Python, CLOS). Algunos lenguajes OO no tienen herencia (por ejemplo, uno mismo, JavaScript y cualquier otro lenguaje basado en prototipos), y algunos lo hacen, pero no es tan importante (prácticamente cualquier lenguaje dinámico o cualquier otro idioma con pato). Lo único que es realmente común para todos ellos es el polimorfismo en tiempo de ejecución. –

+2

De la wikipedia: "Armstrong, Los Quarks del Desarrollo Orientado a Objetos.En orden descendiente de popularidad, los "quarks" son: Herencia, Objeto, Clase, Encapsulación, Método, Mensaje que pasa, Polimorfismo, Abstracción " – Nosredna

+0

Nosredna, y ninguno de ellos tiene un significado preciso. – Apocalisp

Respuesta

56

No hay consenso de la comunidad sobre cuáles son los conceptos esenciales en la programación funcional. En Why Functional Programming Matters (PDF), John Hughes argumenta que son funciones de orden superior y evaluación perezosa. En Wearing the Hair Shirt: A Retrospective on Haskell, Simon Peyton Jones dice que lo realmente esencial no es la pereza sino la pureza. Richard Bird estaría de acuerdo. Pero hay una gran cantidad de programadores de Scheme y ML que están perfectamente felices de escribir programas con efectos secundarios.

Como alguien que ha practicado y enseñado programación funcional durante veinte años, que le puede dar algunas ideas que son ampliamente cree que son el núcleo de la programación funcional:

  • anidada, de primera clase las funciones con alcance léxico apropiado están en el centro. Esto significa que puede crear una función anónima en tiempo de ejecución, cuyas variables gratuitas pueden ser parámetros o variables locales de que incluyen la función, y obtendrá un valor que puede devolver, poner en estructuras de datos, etc. (Esta es la forma más importante de funciones de orden superior, pero algunas funciones de orden superior (como qsort!) Puede escribirse en   C, que no es un lenguaje funcional.)

  • Medios de componer funciones con otra funciones para resolver problemas. Nadie lo hace mejor que John Hughes.

  • Muchos programadores funcionales creen que la pureza (ausencia de efectos, incluida la mutación, E/S y excepciones) es el núcleo de la programación funcional. Muchos programadores funcionales no lo hacen.

  • El polimorfismo, ya sea impuesto por el compilador o no, es un valor central de los programadores funcionales. Confusamente, los programadores de C++ llaman a este concepto "programación genérica". Cuando el compilador impone el polimorfismo, generalmente es una variante de Hindley-Milner, pero el más poderoso System F también es una poderosa base para los lenguajes funcionales. Y con lenguajes como Scheme, Erlang y Lua, puede hacer una programación funcional sin un sistema de tipo estático.

  • Finalmente, la gran mayoría de los programadores funcionales cree en el valor de tipos de datos definidos por inducción, a veces llamados "tipos recursivos". En los idiomas con sistemas de tipo estático, estos se conocen generalmente como "tipos de datos algebraicos", pero encontrará tipos de datos definidos inductivamente incluso en material written for beginning Scheme programmers. Los tipos definidos de forma inductiva generalmente incluyen una característica de idioma llamada que coincide con el patrón, que admite una forma muy general de análisis de casos. A menudo, el compilador puede decirle si ha olvidado un caso. No me gustaría programar sin esta función de idioma (un lujo una vez que se muestrea se convierte en una necesidad).

+2

Creo que el polimorfismo es engañoso. La programación genérica en C++ cubre mucho más que esto (normalmente también utiliza la metaprogramación para habilitar varias implementaciones diferentes, según el tipo; de lo que se trata es más similar a los genéricos .NET que a las plantillas C++/programación genérica).Y esta forma de polimorfismo de tipo paramétrico tiene poco que ver con lo que los programadores de OOP llaman polimorfismo. Si lo hubiera llamado tipos polimórficos, habría sido más claro, creo. – jalf

+0

@Norman Ramsey - Me gusta que hayas llamado pureza y debo admitir que no había escuchado antes que la programación funcional encarna el polimorfismo. Siento que mi respuesta va directamente al grano de la programación funcional, pero encontré que tu escritura es informativa. Gracias. –

35

En informática, la programación funcional es un paradigma de programación que trata el cálculo como la evaluación de las funciones matemáticas y evita los datos de estado y mutables. Enfatiza la aplicación de funciones, en contraste con el estilo de programación imperativa, que enfatiza los cambios de estado. La programación funcional tiene sus raíces en el cálculo lambda, un sistema formal desarrollado en la década de 1930 para investigar la definición de funciones, la aplicación de funciones y la recursión. Muchos lenguajes de programación funcionales se pueden ver como adornos del cálculo lambda. - Wikipedia

En pocas palabras,

  1. cálculo lambda
  2. funciones de orden superior
  3. inmutabilidad
  4. sin efectos secundarios
+0

+1 por corrección, -1 por usar una palabra de 4 letras como 'paradigma'. (ahora tengo que lavar mi teclado ...) – Javier

+0

_paradigm_ es dos palabras consecutivas de 4 letras. – Nosredna

+0

@Javier - Mi siguiente pregunta SO, "¿Qué producto (s) usas para lavar tu teclado?" :) –

3

Abstracción, el proceso de hacer una función parametrizando sobre alguna parte de una expresión.

Aplicación, el proceso de evaluar una función reemplazando sus parámetros con valores específicos.

En cierto modo, eso es todo.

+0

No realmente, hay mucho más en FP que solo eso. –

14

No es una respuesta directa a su pregunta, pero me gustaría señalar que la programación "orientada a objetos" y la funcional no están necesariamente en desacuerdo. Los "conceptos centrales" que cita tienen contrapartes más generales que se aplican igual de bien a la programación funcional.

La encapsulación, más generalmente, es la modularización. Todos los lenguajes puramente funcionales que conozco admiten la programación modular . Podría decir que esos lenguajes implementan la encapsulación mejor que la variedad "OO" típica, ya que los efectos secundarios rompen la encapsulación, y las funciones puras no tienen efectos secundarios.

La herencia, en general, es implicación lógica, que es lo que representa una función. La relación canónica subclass -> superclass es un tipo de función implícita. En lenguajes funcionales, esto se expresa con clases de tipo o implicits (considero que las implicidades son las más generales de estas dos).

El polimorfismo en la escuela "OO" se logra mediante la subtipificación (herencia). Existe un tipo más general de polimorfismo conocido como polimorfismo paramétrico (a.k.a.genéricos), que se verá respaldado por lenguajes de programación puramente funcionales. Además, algunos soportan "clases superiores" o genéricos de orden superior (polimorfismo constructor de tipo ).

Lo que estoy tratando de decir es que sus "conceptos básicos de OO" no son específicos de OO de ninguna manera. Yo, por mi parte, argumentaría que no hay ningún conceptos básicos de OO, de hecho.

+0

Al hacer esto, OO y Funcional pueden funcionar juntos. Algunos lenguajes funcionales (CAML, o OCAML para ser específicos) extraen los conceptos OO y algunos lenguajes OO (como D e incluso C#) usan conceptos funcionales. Yo diría que los "Objetos" son muy importantes para la idea de la programación OO. ;) – CodexArcanum

+2

Entonces solo tiene el problema de definir exactamente qué es un "objeto" y cómo difiere de las cosas que no son objetos. Buena suerte. – Apocalisp

3

Permítanme repetir la respuesta que he dado en un debate en el grupo de programación funcional Bangalore:

Un programa funcional se compone sólo de funciones.Las funciones calculan valores desde sus entradas. Podemos contrastar esto con la programación imperativa , mientras que cuando el programa se ejecuta, los valores de las ubicaciones mutables cambian. En otras palabras, en C o Java, una variable llamada X se refiere a una ubicación cuyo valor cambia. Pero en la programación funcional X es el nombre de un valor (no una ubicación). En cualquier lugar en el que X esté dentro del alcance, tiene el mismo valor (es decir, es referencialmente transparente). En FP, las funciones también son valores. Se pueden pasar como argumentos a otras funciones. Esto se conoce como programación funcional de orden superior . Las funciones de orden superior nos permiten modelar una sorprendente variedad de patrones . Por ejemplo, mira la función de mapa en Lisp. Es representa un patrón donde el programador necesita hacer 'algo' a cada elemento de una lista. Ese 'algo' está codificado como una función y pasado como un argumento para mapear.

Como vimos, la característica más notable de FP es su efecto secundario franquicia. Si una función hace algo más que calcular un valor desde su entrada, entonces está causando un efecto secundario. Tales funciones son no permitidas en FP puro. Es fácil probar funciones libres de efectos secundarios. No hay un estado global para la configuración antes de ejecutar la prueba y allí no es un estado global para verificar después de ejecutar la prueba. Cada función puede probarse de forma independiente simplemente proporcionando su entrada y examinando el valor de retorno . Esto hace que sea fácil escribir pruebas automatizadas. Otra ventaja de de la efectividad de los efectos secundarios es que le da un mejor control en el paralelismo.

Muchos lenguajes de FP tratan la recursión y la iteración correctamente. Lo hacen por apoyando algo llamado tail-recursion. ¿Qué recursividad de cola es - si una función se llama a sí misma, y ​​es lo último que hace, elimina el marco de pila actual de inmediato. En otras palabras, si una función se llama de manera recursiva a la cola 1000 veces, no crece la pila a 1000 de profundidad. Esto hace que las construcciones especiales de bucle sean innecesarias en estos idiomas.

Lambda Calculus es la versión más reducida de un lenguaje FP. Los lenguajes FP de nivel superior como Haskell se compilan en Lambda Cálculo. Tiene solo tres construcciones sintácticas, pero aún así es lo suficientemente expresivo como para representar cualquier abstracción o algoritmo.

Mi opinión es que la FP debe verse como un meta-paradigma. Podemos escribir programas en cualquier estilo, incluido OOP, utilizando las simples abstracciones funcionales proporcionadas por el cálculo de Lambda.

Gracias, - Vijay

original de enlace discusión: http://groups.google.co.in/group/bangalore-fp/browse_thread/thread/4c2cfa7985d7eab3

Cuestiones relacionadas