Una de las principales características de la programación funcional es el uso de funciones sin efectos laterales. Sin embargo, esto también puede hacerse en un lenguaje imperativo. Lo mismo es cierto para las funciones de recursión y lambda (por ejemplo, C++ 0x). Por lo tanto, me pregunto si los lenguajes de programación imperativos son un superconjunto de los funcionales.¿La programación funcional es un subconjunto de la programación imperativa?
Respuesta
En general, no; la programación funcional es un subconjunto de programación declarativa (que incluye lenguajes de programación lógica, como Prolog). Muchos lenguajes imperativos toman prestados elementos de lenguajes de programación funcionales, pero el simple hecho de tener lambdas o funciones referencialmente transparentes no hace que un lenguaje imperativo sea funcional; la programación funcional es más que solo estos elementos.
¿De verdad? He escrito programas en Prolog y algunas cosas relacionadas con SQL, y he escrito programas puramente funcionales. Los dos no parecían similares a mí. –
Son similares en el sentido de que le está diciendo a la computadora * qué hacer (es decir, expresar la lógica de un cálculo) en lugar de * cómo * hacerlo; esa es la definición de programación declarativa. – mipadi
Los lenguajes puramente funcionales son, pero como los lenguajes impuramente funcionales se superponen de nuevo en lugar de ser un subconjunto apropiado. – Zorf
Es posible implementar un cierto paradigma de programación en un lenguaje que no admite el paradigma de programación de forma nativa. Por ejemplo, es posible escribir código orientado a objetos en C, mientras que no está diseñado para este fin.
La programación funcional es un paradigma de programación bien desarrollado y se aprende mejor a través de lenguajes como Haskell, LISP, etc. Y después de haberlos aprendido bien, aunque no los use regularmente, puede comenzar a usarlos esos principios en el lenguaje cotidiano que usa regularmente.
Algunas personas pueden tener gusto de Google para Object oriented programming in C
Lo que dices sobre C no tiene sentido, excepto en el más trivial que puedes tener un "objeto". ¿Cuál es el significado de OOP sin polimorfismo y herencia? – user44242
puede implementar sus propios vtables en c si lo desea –
Es ciertamente posible escribir código orientado a objetos en C; lo hicimos en un proyecto de fines de los '80, trabajando en OS/2 donde no había OO languages. Exigió un gran conjunto de macros (y un poco de locura) para implementar el polimorfismo y la herencia, pero funcionó. –
Realmente no puedo decir si son subconjunto de uno al otro. Lo que puedo decir, sin embargo, es que (a excepción de los lenguajes realmente esotéricos) son todos Turing-complete, lo que significa que al final todos son igualmente poderosos, pero no necesariamente igualmente expresivos.
Un paradigma es una forma de hacer las cosas, y existen dos paradigmas de programación principales: imperativo y declarativo. El hecho de que algunos lenguajes permitan mezclar ambos paradigmas no significa que uno esté incluido en el otro, sino que los idiomas son multi-paradigma.
Para aclararlo un poco más, permítanme continuar con su analogía: si Lisp y OCaml (por ejemplo) se consideran lenguajes funcionales, y ambos permiten un estilo imperativo ... entonces debe considerarse un subconjunto de ¿funcional?
Lisp (Common Lisp, específicamente) se conoce generalmente como un lenguaje multi-paradigma. Puede escribir código imperativo y funcional con relativa facilidad. – Vatine
Lisp se conoce como multi-paradigma exactamente tanto como C++. Los puristas dirán que son multi-paradigmas (y tienen razón), pero en el uso común generalmente se los refiere como funcionales e imperativos/orientados a objetos respectivamente. De todos modos, mi punto era que si se pueden hacer ambos paradigmas, el lenguaje _es_ multi paradigma, por lo que la pregunta de la operación se declaró erróneamente desde el principio. – fortran
La mayoría de los idiomas imprescindibles no tienen funciones como tipos de primer orden, mientras que la mayoría de los funcionald o. (Al igual que C++, a través de boost :: function.)
Por tipo de primer orden, este valor un meas/variable puede ser de cualquier tipo, un int, un bool, una función de int-> bool. Por lo general, también incluye cierres o valores encuadernados, donde tiene la misma función, pero algunos argumentos ya están completados.
Esas dos son de lo que se trata principalmente la programación funcional, en mi humilde opinión.
mapeo Plan como
f:: [int] -> int
f [] = 0
f (x:xs) = 1 + f(xs)
es algo que es, por ejemplo, una cosa que no está disponible en los lenguajes imperativos. también construye como funciones al curry:
add2 :: int -> int
add2 = (2 +)
no está disponible en los idiomas más imperativas
El currying se puede hacer en C++ usando plantillas: http://stackoverflow.com/questions/152005/how-can-currying-be-done-in-c –
yo creo que puede ser útil para establecer una distinción entre paradigma y idioma.
Para mí, paradigmas representan "formas de pensamiento" (conceptos y abstracciones tales como funciones, objetos, recursividad), mientras que idiomas oferta "formas de hacer" (sintaxis, las variables, las evaluaciones) .
Todo esto es cierto lenguajes de programación son equivalentes en el sentido de que son Turing completo y capaz, en teoría, para calcular cualquier función de Turing-computable, así como simular o ser simulado por una máquina universal de Turing.
Lo interesante es lo difícil que es realizar ciertas tareas en ciertos lenguajes o paradigmas, qué tan apropiada es la herramienta para la tarea. Incluso el Juego de la vida de Conway es completo, pero eso no me hace querer programar con él.
Muchos idiomas admiten una serie de paradigmas. C++ se diseñó como una extensión orientada a objetos para C, pero es posible escribir código puramente procedimental en ella.
Algunos idiomas toman prestado/adquieren características de otros lenguajes o paradigmas a lo largo del tiempo (basta con observar la evolución de Java).
Algunos lenguajes, como Common Lisp, son impresionantes idiomas multi-paradigma. Es posible escribir código que sea funcional, orientado a objetos o de procedimiento en Lisp. Podría decirse que la orientación de aspecto ya es parte del sistema común de objetos de ceceo y, por lo tanto, "nada especial". En Lisp, es fácil extender el idioma en sí para hacer lo que sea necesario, por lo que a veces se lo denomina "lenguaje de programación programable". (Señalaré aquí que Lisp describe una familia de idiomas de los cuales Common Lisp es solo un dialecto).
Creo que no importa cuál de los términos, declarativo, imperativo, funcional o de procedimiento, es un subconjunto de los cuales. Lo que más importa es comprender los idiomas de las herramientas con las que está trabajando y cómo son diferentes de otras herramientas. Aún más importante es comprender las diferentes formas de pensar que representan los paradigmas, ya que esas son sus herramientas de pensamiento. Como con la mayoría de las otras cosas en la vida, cuanto más entiendes, más efectivo eres.
"no importa cuál de los términos es un subconjunto de cuál ": Parte de la razón por la que pregunté esto fue porque me gustan algunos de los conceptos de programación funcional, pero no me gustan sus limitaciones, como la manera notoriamente difícil de tratar con E/S y el uso extensivo de la recursión . –
¿Desde cuándo la recursión es una limitación? Los bucles y la recursividad son dos caras de la misma moneda, pero una es a menudo más apropiada que la otra. La programación funcional es un paradigma, el lenguaje específico (su sintaxis y sus bibliotecas) determina "qué tan difícil" es para cosas como E/S o bucles. Su uso de la palabra "notorio" sugeriría que no se ha cuidado bien. Por favor hazlo - Encontré que la E/S era bastante "difícil" de entender en Java 2, pero solo estaba usando los Javadocs para resolverlo. Elija un idioma que le parezca "amigable" y comience a leer sobre él. – Galghamon
Una forma de verlo (sin decir que es la manera correcta 'porque no soy un diseñador o teórico de lang de ninguna manera) es que si el lenguaje se convierte esencialmente en algo más que ese' algo más 'debe ser el superconjunto de la fuente. Entonces bytecode es necesariamente un superconjunto de Java. .NET IL es un superconjunto de C# y de F #. Las construcciones funcionales en C# (es decir, LINQ) son, por lo tanto, un subconjunto de las construcciones imperativas de IL.
Dado que el lenguaje de máquina es imperativo, puede tomar la posición de que, por lo tanto, todos los idiomas son imperativos, porque son solo abstracciones útiles para humanos que el compilador luego borra a código de máquina imperativo de procedimiento.
+1 ¡Bonito comentario! Me gustaría votar, pero no funciona ("votar demasiado viejo para ser cambiado"). Lo siento :( –
- 1. ¿Se debe enseñar la programación funcional antes de la programación imperativa?
- 2. ¿Por qué es buena la programación funcional?
- 3. ¿XSLT es un lenguaje de programación funcional?
- 4. ¿Qué es zip (programación funcional?)
- 5. ¿Qué es un estilo sin puntos en la programación funcional?
- 6. Arquitectura de programación funcional
- 7. Acerca de la programación de estilo funcional
- 8. Errores/Desventajas de la Programación Funcional
- 9. Punto de definición de la programación funcional
- 10. programación funcional: inmutable eficiencia de la estructura de datos
- 11. Documentación de programación funcional
- 12. Programación funcional aplicada
- 13. Haskell - Programación funcional Ayuda
- 14. Programación funcional: Efectos secundarios
- 15. programación funcional en Java
- 16. Comentarios adecuados para la programación funcional
- 17. ¿A qué tipo de problema es adecuada la programación funcional?
- 18. Programación funcional en C++
- 19. Programación funcional pura para la GPU
- 20. ¿Cuál es la diferencia entre la programación declarativa y la imperativa?
- 21. SÓLIDO para programación funcional
- 22. ¿Cómo puedo comenzar con la programación funcional?
- 23. Scala gimnasia de programación funcional
- 24. Programación funcional: Mejor plataforma/Entorno
- 25. Programación funcional pura en D
- 26. Programación funcional en plantas nucleares?
- 27. Beneficios y usos de un lenguaje de programación funcional
- 28. ¿La programación en paralelo es == programación multiproceso?
- 29. ¿Qué lenguaje de programación funcional debería elegir como primer lenguaje de programación funcional?
- 30. Programación funcional de la base de datos en Clojure
pregunta interesante ...en la programación imperativa, tienes más formas de "ahorcarte", creo :-) – jldupont
Estoy de acuerdo con tu forma de pensar en lo que se refiere a las "funciones sin efectos secundarios". Se puede escribir y usar una biblioteca de "funciones sin efectos laterales" en ambos paradigmas, mientras que los procedimientos imperativos con estado no se pueden usar en la programación funcional. – masterxilo